Hi, I have a form that submits values from text fields and a check box.
The values posted are: camp location name, number of nights, number of
parents, number of children, value from the check box "family claim".
Where camp name can''t be nil, nights can''t be more than 2,
parents and
children together can''t be more than 8 and if there are no children
specified check box can''t be checked. Here''s my unsuccessful
implementation for this:
def add_to_cart
begin
cart=find_cart
camp_loc = params[:camp][:id]
nights=params[:nights]
parents=params[:parents]
children=params[:children]
family_rate_claim=params[:family_claim]
rescue
redirect_to_booking("Invalid input.")
end
if camp_loc.blank? || nights.blank? || parents.blank?
redirect_to_booking("Fields with ''*'' are required
fields.")
elsif (nights.to_i > 2) || ((parents.to_i + children.to_i) > 8)
redirect_to_booking("Limitation: Maximum stay of 2 nights with group
of maximum 8 people.")
elsif children.nil? and family_rate_claim == "1"
redirect_to_booking("You are not eligible for claiming family
rate.")
else
....add the stuff in the cart
end
end
def redirect_to_booking(msg)
flash[:notice]=msg
render :action => :online_booking
end
When I click the button without giving anything as the input I get this:
Render and/or redirect were called multiple times in this action. Please
note that you may only call render OR redirect, and at most once per
action. Also note that neither redirect nor render terminate execution
of the action, so if you want to exit an action after redirecting, you
need to do something like "redirect_to(...) and return".
but what I want is to to get redirected to the same page with error
information.
thanks..
--
Posted via http://www.ruby-forum.com/.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---
the "render or redirect called multiple times" error is because you haven''t called ''return'' after you called ''render'' or indeed ''redirect_to''. It doesn''t actually do the render or redirect immediately. It only occurs after the method has returned. RobL Jay Pangmi wrote:> Hi, I have a form that submits values from text fields and a check box. > The values posted are: camp location name, number of nights, number of > parents, number of children, value from the check box "family claim". > Where camp name can''t be nil, nights can''t be more than 2, parents and > children together can''t be more than 8 and if there are no children > specified check box can''t be checked. Here''s my unsuccessful > implementation for this: > > def add_to_cart > begin > cart=find_cart > camp_loc = params[:camp][:id] > nights=params[:nights] > parents=params[:parents] > children=params[:children] > family_rate_claim=params[:family_claim] > rescue > redirect_to_booking("Invalid input.") > end > if camp_loc.blank? || nights.blank? || parents.blank? > redirect_to_booking("Fields with ''*'' are required fields.") > elsif (nights.to_i > 2) || ((parents.to_i + children.to_i) > 8) > redirect_to_booking("Limitation: Maximum stay of 2 nights with group > of maximum 8 people.") > elsif children.nil? and family_rate_claim == "1" > redirect_to_booking("You are not eligible for claiming family > rate.") > else > ....add the stuff in the cart > end > end > > def redirect_to_booking(msg) > flash[:notice]=msg > render :action => :online_booking > end > > When I click the button without giving anything as the input I get this: > > Render and/or redirect were called multiple times in this action. Please > note that you may only call render OR redirect, and at most once per > action. Also note that neither redirect nor render terminate execution > of the action, so if you want to exit an action after redirecting, you > need to do something like "redirect_to(...) and return". > > but what I want is to to get redirected to the same page with error > information. > thanks.. >--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
I wouldn''t do any vaildation in the controller, its messy and not ideal. I''d have some kind of ''Booking'' object which presumably is what you are adding to your cart and validate it inside that using the rails validation helpers. RobL Jay Pangmi wrote:> Hi, I have a form that submits values from text fields and a check box. > The values posted are: camp location name, number of nights, number of > parents, number of children, value from the check box "family claim". > Where camp name can''t be nil, nights can''t be more than 2, parents and > children together can''t be more than 8 and if there are no children > specified check box can''t be checked. Here''s my unsuccessful > implementation for this: > > def add_to_cart > begin > cart=find_cart > camp_loc = params[:camp][:id] > nights=params[:nights] > parents=params[:parents] > children=params[:children] > family_rate_claim=params[:family_claim] > rescue > redirect_to_booking("Invalid input.") > end > if camp_loc.blank? || nights.blank? || parents.blank? > redirect_to_booking("Fields with ''*'' are required fields.") > elsif (nights.to_i > 2) || ((parents.to_i + children.to_i) > 8) > redirect_to_booking("Limitation: Maximum stay of 2 nights with group > of maximum 8 people.") > elsif children.nil? and family_rate_claim == "1" > redirect_to_booking("You are not eligible for claiming family > rate.") > else > ....add the stuff in the cart > end > end > > def redirect_to_booking(msg) > flash[:notice]=msg > render :action => :online_booking > end > > When I click the button without giving anything as the input I get this: > > Render and/or redirect were called multiple times in this action. Please > note that you may only call render OR redirect, and at most once per > action. Also note that neither redirect nor render terminate execution > of the action, so if you want to exit an action after redirecting, you > need to do something like "redirect_to(...) and return". > > but what I want is to to get redirected to the same page with error > information. > thanks.. >--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Jay Pangmi wrote: you specific problem here is - ...> rescue > redirect_to_booking("Invalid input.") > endYou render here> if camp_loc.blank? || nights.blank? || parents.blank? > redirect_to_booking("Fields with ''*'' are required fields.") > elsif (nights.to_i > 2) || ((parents.to_i + children.to_i) > 8) > redirect_to_booking("Limitation: Maximum stay of 2 nights with group > of maximum 8 people.") > elsif children.nil? and family_rate_claim == "1" > redirect_to_booking("You are not eligible for claiming familyAnd also here Do . return( redirect_to_booking("Invalid input.") ) So your code doesn''t fall through. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
On Oct 17, 4:55 am, Andrew Porter <a...-OV3k8GMR8cdg9hUCZPvPmw@public.gmane.org> wrote:> Jay Pangmi wrote: > > you specific problem here is - > > ... > > > rescue > > redirect_to_booking("Invalid input.") > > end > > You render here > > > if camp_loc.blank? || nights.blank? || parents.blank? > > redirect_to_booking("Fields with ''*'' are required fields.") > > elsif (nights.to_i > 2) || ((parents.to_i + children.to_i) > 8) > > redirect_to_booking("Limitation: Maximum stay of 2 nights with group > > of maximum 8 people.") > > elsif children.nil? and family_rate_claim == "1" > > redirect_to_booking("You are not eligible for claiming family > > And also here > > Do . > > return( redirect_to_booking("Invalid input.") ) > > So your code doesn''t fall through.I think there''s a relationship between the problem you are experiencing and the face that you are performing validations in your controller and not your model. As Rob said above, you should move the validations:> if camp_loc.blank? || nights.blank? || parents.blank? > elsif (nights.to_i > 2) || ((parents.to_i + children.to_i) > 8) > elsif children.nil? and family_rate_claim == "1"to your model and use ActiveRecord validations: http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html and callbacks: http://api.rubyonrails.com/classes/ActiveRecord/Callbacks.html to implement the validations in your models Then you could call save (or valid?) and use error_messages_for (vs. flash) to display your messages. This is all in addition to calling return with each render. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
On Oct 17, 4:55 am, Andrew Porter <a...-OV3k8GMR8cdg9hUCZPvPmw@public.gmane.org> wrote:> Jay Pangmi wrote: > > you specific problem here is - > > ... > > > rescue > > redirect_to_booking("Invalid input.") > > end > > You render here > > > if camp_loc.blank? || nights.blank? || parents.blank? > > redirect_to_booking("Fields with ''*'' are required fields.") > > elsif (nights.to_i > 2) || ((parents.to_i + children.to_i) > 8) > > redirect_to_booking("Limitation: Maximum stay of 2 nights with group > > of maximum 8 people.") > > elsif children.nil? and family_rate_claim == "1" > > redirect_to_booking("You are not eligible for claiming family > > And also here > > Do . > > return( redirect_to_booking("Invalid input.") ) > > So your code doesn''t fall through.I think there''s a relationship between the problem you are experiencing and the face that you are performing validations in your controller and not your model. As Rob said above, you should move the validations:> if camp_loc.blank? || nights.blank? || parents.blank? > elsif (nights.to_i > 2) || ((parents.to_i + children.to_i) > 8) > elsif children.nil? and family_rate_claim == "1"to your model and use ActiveRecord validations: http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html and callbacks: http://api.rubyonrails.com/classes/ActiveRecord/Callbacks.html to implement the validations in your models Then you could call save (or valid?) and use error_messages_for (vs. flash) to display your messages. This is all in addition to calling return with each render. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Thanks guys for your suggestions. I have now moved all the validations
to the model class and ended up with couple of question again. I''ve
done
like the following:
MODEL CLASS:
--------------------------------------------------------------------------------
class Cart < ActiveRecord::Base
validates_presence_of :campsite, :arrival_date, :nights, :parents,
:total
def validate
errors.add(:nights, "should be equal to or less than 2") if nights
>
2
errors.add(:total, "should be greater than 0") if total < 0.01
end
end
--------------------------------------------------------------------------------
CONTROLLER:
--------------------------------------------------------------------------------
def add_to_cart
cart=find_cart
if params[:family_claim] != "1"
total = (((params[:parents].to_i + params[:children].to_i) * 4.85)
* params[:nights].to_i)
else
total = (19.4 * params[:nights].to_i)
end
cart=Cart.create(:campsite => params[:camp][:id], :arrival_date =>
params[:arrival_date],
:nights => params[:nights], :parents =>
params[:parents],
:children => params[:children], :family_claim =>
params[:family_claim],
:total => total)
if cart.save
@cart << cart.id
@cart_details = find_items_in_session
else
render :action => :online_booking
end
end
--------------------------------------------------------------------------------
VIEW:
--------------------------------------------------------------------------------
<div>
<%=error_messages_for ''cart''%>
<%form_tag :action=>:add_to_cart do%>
<div id="this part gets replaced by partial>
<%=select_tag "campsite", %w{---}%>
</div>
...........
<%end%>
</div>
--------------------------------------------------------------------------------
1)Now, when I give 3 or more for the number of nights, online_booking
should be rendered again with the message "should be equal to or less
than 2", isn''t it? but I don''t get any message just the
online_booking
page is redisplayed.
2)In the validation I have to validate that the number of parents and
children together can''t be more than 8 (children can be null so
it''s not
checked). How do I do this?
3)One field gets replaced by partial before the form is submitted. So,
if I submit the form before making that partial loaded, id for that
field is passed as params[:campsite] and params[:camp][:id] if the
partial is loaded. How can I check for this? In the controller I''m
tried
to do:
--------------------------------------------------------------------------------
if !params[:camp][:id].nil?
camp_loc = params[:camp][:id]
else
camp_loc = params[:campsite]
end
--------------------------------------------------------------------------------
but failed and I think the reason is: params[:camp][:id] is no where to
be found if the partial is not loaded and if I try with
params[:campsite] its the same if the partial is loaded. So, how can I
solve it as it gives me error in the same line where the if clause is?
thanks.
--
Posted via http://www.ruby-forum.com/.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---