FormBuilder object in a helper?

I want to DRY up my form-for.

#new.html.erb
<% form_for @organization, :url => organization_path do |f| %>
   <%= f.label :church_name, "Church Name:" %>
   <%= f.text_field :church_name,
    :class => 'input-field',
    :size => 30 %>
    <%= error_message_on :organization, :church_name %>
<% end %>

with

#new.html.erb
<% form_for @organization, :url => organization_path do |f| %>
   <%= text_field_with_errors( :church_name, "Church Name") %>
<% end %>

# organization_helper
def text_field_with_errors( f, display_name, size = 30 )
    f.label( method, (display_name + ':') ) <<
    f.text_field( method,
  :class => 'input-field',
  :size => size ) <<
  error_message_on( f, method )
  end

But rails throws and error about can put a FormBuilder object into an
instance variable.

Not quite sure I understand. So, how would I DRY up this form?

I want to DRY up my form-for.

#new.html.erb
<% form_for @organization, :url => organization_path do |f| %>
  <%= f.label :church_name, "Church Name:" %>
  <%= f.text_field :church_name,
    :class => 'input-field',
    :size => 30 %>
    <%= error_message_on :organization, :church_name %>
<% end %>

with

#new.html.erb
<% form_for @organization, :url => organization_path do |f| %>
  <%= text_field_with_errors( :church_name, "Church Name") %>
<% end %>

You're not passing f to your helper function.

Fred

You're not passing f to your helper function.

That was a typo on my part when I pasted/cleaned the code for posting.

#new.html.erb
<% form_for @organization, :url => organization_path do |f| %>
   <%= text_field_with_errors( f, :church_name, "Church Name") %>
<% end %>

The exact error is:
`@#<ActionView::Base:0x24dda6c>' is not allowed as an instance
variable name

I thought you could pass any object to a method. Right?

Well yes, but that method might not like it (eg trying to evaluate the square root of "cucumber"). I think we need to see exactly what code you're running. You could have edited out the problem and it's difficult to work out what's wrong if what we're looking at isn't what is actually being executed.

Fred

Well yes, but that method might not like it (eg trying to evaluate the
square root of "cucumber"). I think we need to see exactly what code
you're running. You could have edited out the problem and it's
difficult to work out what's wrong if what we're looking at isn't what
is actually being executed.

Ok, there is the full code:

module OrganizationEventsHelper
  def text_field_with_errors( f, method, display_name, size = 30,
options = {} )
    self.label( method, (display_name + ':') ) <<
    self.text_field( method,
      :class => 'input-field',
      :size => size ) <<
      error_message_on( self, method )
  end
end

<% form_for @organization, :url => organization_events_path do |f| %>
  <fieldset>
    <legend>Church Info</legend>
    <ol>
      <li><%= text_field_with_errors( f, :church_name, "Church Name") %></

                </ol>
        </fieldset>

<fieldset class="submit">
    <%= f.submit "Create" %>
</fieldset>
<% end %>

Note: I omitted the repetitious code.

Error message:
ActionView::TemplateError (`@#<ActionView::Base:0x256474c>' is not
allowed as an instance variable name) on line #33 of
organization_events/new.html.erb:
30: :size => 30 %>
31: <%= error_message_on :organization, :church_name %></li>
32:
33: <li><%= text_field_with_errors( f, :church_name, "Church
Name") %></li>
34:
35: <li><%= f.label :address1, "Address:" %>
36: <%= f.text_field :address1,

    config/initializers/field_error_patch.rb:29:in
`instance_variable_get'
    config/initializers/field_error_patch.rb:29:in `error_message_on'
    app/helpers/organization_events_helper.rb:9:in
`text_field_with_errors'
    app/views/organization_events/new.html.erb:33:in
`_run_erb_47app47views47organization_events47new46html46erb'
    /Library/Ruby/Gems/1.8/gems/actionpack-2.0.2/lib/action_view/
helpers/form_helper.rb:248:in `fields_for'
    /Library/Ruby/Gems/1.8/gems/actionpack-2.0.2/lib/action_view/
helpers/form_helper.rb:184:in `form_for'
    app/views/organization_events/new.html.erb:22:in
`_run_erb_47app47views47organization_events47new46html46erb'
    /Library/Ruby/Gems/1.8/gems/actionpack-2.0.2/lib/action_view/
base.rb:637:in `send'
    /Library/Ruby/Gems/1.8/gems/actionpack-2.0.2/lib/action_view/
base.rb:637:in `compile_and_render_template'
    <snip>

Let me know if think the whole stack trace would help.
Thanks for the help, Fred.

Oops, slight change, I was trying to see if I could self. Doesn't
really matter, either self or just f, neither works.

module OrganizationEventsHelper
  def text_field_with_errors( f, method, display_name, size = 30,
options = {} )
    f.label( method, (display_name + ':') ) <<
    f.text_field( method,
      :class => 'input-field',
      :size => size ) <<
      error_message_on( f, method )
  end
end

Oops, slight change, I was trying to see if I could self. Doesn't
really matter, either self or just f, neither works.

So the problem is with error_message_on. the version you called is
expecting the first parameter to be the name of an instance variable.
You're all form buildered up, so you just need
f.error_message_on(method) (this doesn't work prior to rails 2)

Fred.

So the problem is with error_message_on. the version you called is
expecting the first parameter to be the name of an instance variable.
You're all form buildered up, so you just need
f.error_message_on(method) (this doesn't work prior to rails 2)

Close! I get this error now:

ActionView::TemplateError (wrong number of arguments (5 for 2)) on
line #33 of organization_events/new.html.erb:
30: :size => 30 %>
31: <%= error_message_on :organization, :church_name %></li>
32:
33: <li><%= text_field_with_errors( f, :church_name, "Church
Name") %></li>
34:
35: <li><%= f.label :address1, "Address:" %>
36: <%= f.text_field :address1,

    /Library/Ruby/Gems/1.8/gems/actionpack-2.0.2/lib/action_view/
helpers/form_helper.rb:672:in `error_message_on'
    /Library/Ruby/Gems/1.8/gems/actionpack-2.0.2/lib/action_view/
helpers/form_helper.rb:672:in `error_message_on'

I'm on rails 2.0.2.

So the problem is with error_message_on. the version you called is
expecting the first parameter to be the name of an instance variable.
You're all form buildered up, so you just need
f.error_message_on(method) (this doesn't work prior to rails 2)

Close! I get this error now:

ActionView::TemplateError (wrong number of arguments (5 for 2)) on

That's odd - if you get that far it should work. You haven't got any
plugins installed tha might be messing with that have you ?

Ahh HA! Yes, I had patched the
ActionView::Helpers::ActiveRecordHelper / error_message_on method. I
didn't like having the error text wrapped in divs, so I changed it to
spans. I copied the ARH method exactly, only changing the <div> to
<span>, but it looks like that doesn't allow it being a form_builder
object anymore.

But... I fired up ruby-debug and did an inspect on f (that is one
monster object). Combing through I found that f.object refers to the
model, so (drum roll please):

error_message_on( f.object, method)

Works!

Simple, fix, and I get to keep my span tags.

Fred, thanks for sticking through this with me!