Showing a Form

Hi,

Thanks to Erol for giving me input on how to move stuff to a namespace. It meant some work, so next time I will spend more time thinking before blasting off.

I’ve stored a Form in my DB which has Elements. Below is my FormsController. All it does is show.

class FormsController < ApplicationController

def show

@form = Form.find(params[:id])

@elements = Element.find(:all, :conditions => { :form_id => @form })

respond_to do |format|

format.html # show.html.erb

end

end

end

I get stuck creating the view. It should go through all of the Form’s elements and display a label with the Element’s name, and a text field with the Element’s value.

Right now I have this:

<% form_for @form, :url => { :action => ‘create’ } do |f| %>

<%= @[form.name](http://form.name) %>

<% form_for(@form) do |f| %>

<% for element in @elements %>

<%= f.label_tag ‘value’, ‘name’ %>

<%= f.text_field_tag ‘value’, element.value %>

<% end %>

<%= f.submit ‘Submit’ %>

<% end %>

<% end %>

I get this error:

undefined method `label_tag’ for #ActionView::Helpers::FormBuilder:0xbcd7ee

Whenever you're using form_for(anObject), you want to use FormHelpers:

http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html

Whenever you're using a standalone form that's not tied to a model's attributes (IE, one in which you do not pass the FormConstructor into the block as 'f', on which you'd call f.text_field ) you want to use FormTagHelpers:

http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html

You're using form_for with an object, which means you should use the 'tagless' versions of the form constructors, but instead you're using f.text_field_tag. The correct syntax is:

f.text_field :attribute_name, {value => element.value}

However, since you're linking up associations in your form you'll want to use the fields_for helper, to bring the constructor into scope while still referring to the proper element in the form. Read about it here:

http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#M001741

Now, since you can set up Forms to 'has_many' Elements, and Elements 'belong_to' a Form, you can make your query like this in your Controller:

@form = Form.find(params[:id], {:include => :elements})

And then have the following code in your controller (Or something like it, play with it a bit, I've never done anything exactly like this before) :

<%= form_for @form, :action => create do |f| %>   <% @form.elements.each do |element| %>     <% fields_for element do |e| %>       <%= e.label 'value' %>       <%= e.text_field :value %>     <% end %>   <% end %>   <%= submit_tag %> <% end %>

Play with the params output of that, and adjust your create action accordingly.

If that's not pretty enough for you, use HAML:

= form_for @form, :action => create do |f|   - @form.elemenst.each do |element|     - fields_for element do |e|       = e.label 'value'       = e.text_field :value   = submit_tag