Forum: Ruby on Rails :failure and :success in form_remote_tag

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
a.filipowski (Guest)
on 2005-12-09 02:10
(Received via mailing list)
I have a form that unfortunatly is not associated with a model as it
is created dynamically based on selections from a user. I have a
validation action called validate_the_form to make sure that fields
the user signifies as required are acctually required. On submit I
run the validation and redirect to the the form if there are any
errors displaying the errors on top. Really I want to mimic the way
that validate works in a model where there are errors on top as well
as highlighting the fields that are missing the info that is needed
but I also want to keep the values that are correct selected and
filled out.

I was taking a look at the options for form_remote_tag and figured
that I could submit the form via ajax and have set up the form remote
tag like this:

<%= form_remote_tag(:url => { :action => 'validate_the_form'},
                     :update => { :success => "form_area", :failure
=> "error_area" }) %>

my question is I am not sure where to go from here. i can't figure
out how to define what is a failure. Am I going down the right track?
or is there another way to do this? I also looked in my copy of Agile
Web Dev and they have an example but it does not keep values that are
selected and or filled out in the form if there is a failure.

Thanks for all the help

Andrew
a.filipowski (Guest)
on 2005-12-09 02:26
(Received via mailing list)
On a side note I did look at the example on the wiki as well as this
one "Validations for non-ActiveRecord Model Objects" but I don't
think that they will work for me as I don't have a model for this
form. The form is built dynamically based on several other models but
because the options that I need to validate are not constant (for
example a set of radio buttons could require that there is a choice
or not require one at all) based on what the user defines. Since
these fields are completely unknown I am not sure where to go.

Andrew
ezra (Guest)
on 2005-12-09 04:28
(Received via mailing list)
>

Here is a very nice way of still being able to use validations
without the need for a database model. It just fakes rails out into
thinking the model is an AR model and you just cant .save it , you
call .valid? on it to check the validations:

class Contact < ActiveRecord::Base
   def self.columns() @columns ||= []; end
   def self.column(name, sql_type = nil, default = nil, null = true)
     columns << ActiveRecord::ConnectionAdapters::Column.new
(name.to_s, default, sql_type.to_s, null)
   end

   column :name,          :string
   column :city,          :string
   column :state,         :string
   column :phone,         :string
   column :email_address, :string

   validates_presence_of :name, :email_address
end


Cheers-

-Ezra Z.
WebMaster
Yakima Herald-Republic Newspaper
removed_email_address@domain.invalid
509-577-7732
ezra (Guest)
on 2005-12-09 04:44
(Received via mailing list)
On Dec 8, 2005, at 6:24 PM, Ezra Z. wrote:

>     columns << ActiveRecord::ConnectionAdapters::Column.new
> end
>
>


Oh and I forgot to credit technoweenie for writing it ;-)

-Ezra Z.
WebMaster
Yakima Herald-Republic Newspaper
removed_email_address@domain.invalid
509-577-7732
a.filipowski (Guest)
on 2005-12-09 15:42
(Received via mailing list)
I looked at that but not sure that it will work in my situation. as I
don't know what will be required or not ahead of time. Since I don't
know what will be required I can't define the validate_presence_of
the fields. Also I don't know what the field names are ahead of time
either. They are generated on the fly when the page is rendered. Here
is a look at my validate method that I have written. I think I am on
the right track writing my own action just not sure how to repopulate
the fields if there is an error.

def validate_the_form
		@errors = []
		@ theform = Form.find(params[: theformid])
		# loop through all the fields to validate the responses given match
the requirements defined
		# by the form author
		@form.questions.each do |@question|
			# Check to see if the question is required
			if @question.required == 1
				# we need to do something special to validate if the checkbox
type is required
				# here we check to see if it is a checkbox
				if @question.field_type == 'checkbox'
					# if it is a check box we loop thru the choices to check if they
are checked
					counter = 0
					@question.choices.each do |@choice|
						if params["#{@choice.id}question_#{@question.id}"] != nil
							counter = counter + 1
						end
					end
					# if no check boxes are checked we kick out an error
					if counter == 0
						@errors << "#{@question.question_text}"
					end
				# if it is not a checkbox we make sure that there is not a null
value
				else
					if params["question_#{@question.id}"] == nil or params
["question_#{@question.id}"] == ''
						@errors << "#{@question.question_text}"
					end
				end
			end
			# we next check our checkbox type to make sure that the minimum and
			# maximum values defined by the offer are adhered to
			if @question.field_type == 'checkbox'
				# make sure that maximum responses are adhered to
				if @question.max_responses != nil
					if checked > @question.max_responses
						@errors << "#{@question.question_text} to many responses"
					end
				end
				# make sure that minimum responses are adhered to
				if @question.min_responses != nil
					if checked < @question.min_responses
						@errors << "#{@question.question_text} to few responses"
					end
				end
			end
		end
		# if we have no errors submit the form other wise we kick back to
the form
		if @errors.size == 0
			submit_the_form
		else
			render :action => 'take', :id => @theform.id, :errors => @errors
		end
	end

my view right now has allot of logic in it to build the form. I think
that I should be using helpers for it but it works right now. This
app is in scaffold stage right now. I just want to get it working and
than will go back and do some code cleanup during the the time that I
make the views pretty.

here is just a piece of the view:

<div id="error_area">
<% if params[:errors] != nil %>
	<% 0.upto(params[:errors].size - 1) do |x| %>
		The Question: <%= params[:errors][x] %><br/>
		Is Required<br/><br/>
	<% end %>
<% end %>
<p style="color: red"><%= flash[:notice] %></p>
</div>
<%= @theform.name %>
<div id="form_area">
<%= form_remote_tag(:url => { :action => 'validate_the_form'},
                     :update => { :success => "form_area", :failure
=> "error_area" }) %>
	<%= hidden_field_tag(: theformid, @ theform.id) %>
	<% @questions.each do |@question| %>
		<%= @question.question_text %><br/>
			<% if @question.field_type == 'radio' %>
				<% @question.choices.each do |@choice| %>
					<% questionid = "question_#{@question.id}" %>
					<%= radio_button_tag("question_#{@question.id}",
@choice.choice_text) %><%= h(@choice.choice_text) %><br/>
				<% end %>

I than go through a bunch of more elsifs to create the different
fields (checkbox, textfield, textarea and so on)

<%= submit_tag 'Submit' %>
<%= end_form_tag %>
</div>

As I said I think that I am heading in the right direction I am just
not sure how to kick back a failure from the validate method to the
form_remote_tag

Andrew
This topic is locked and can not be replied to.