Pass variable from template to view
30 Jun 2010
Maybe I'm missing a code smell but I needed to pass a variable from my template to my view. The template renders a very generic form and I wanted to add a field to it from my view. I wanted the code to look something like this:
<% render :layout => '/layouts/confirm', :locals => { :entity => @voucher } do |f| %> <%= f.input :redeemed_by, :label=>"Voucher Used By" %> <% end %>
I'm using formtastic and the |f| coming down the chute is meant to be the formtastic form builder object.
I tried adding a yield to my layout file like this:
<% semantic_form_for(entity) do |f| %> <%= yield f %> <% f.buttons do %> <%= submit_tag "Confirm" %> <%= submit_tag "Cancel", :name => "cancel", :class=>"submit-other" %> <% end %> <% end %>
That resulted in this error message:
`@content_for_#<Formtastic::SemanticFormBuilder:0x10ae6b490>' is not allowed as an instance variable name
So, after about an hour of searching and reading I tried to figure out how to turn the entire layout file into a helper method. That didn't look like something I wanted to do. Then I started, as I said to my boss, "typing in random crap" and found something that worked:
Layout:
<% semantic_form_for(entity) do |f| %> <%= yield :ignore, f %> <% f.buttons do %> <%= submit_tag "Confirm" %> <%= submit_tag "Cancel", :name => "cancel", :class=>"submit-other" %> <% end %> <% end %>
View:
<% render :layout => '/layouts/confirm', :locals => { :entity => @voucher } do |ignore, f| %> <%= f.input :redeemed_by, :label=>"Voucher Used By" %> <% end %>
TADA!