Extend form_for

I’m trying to extend form_for to add a hidden field to certain forms
but not others. I realize that I need to push it on to the end of the
&proc, but have yet to find an elegant way of doing it and was
wondering if anyone had any insights?

This is as close as I’ve come to doing it without having to copy and
paste the whole form_for method in to the else:

module ActionView
module Helpers
module FormHelper
def form_for_with_session_included(record_or_name_or_array,
*args, &proc)
if !bad_request?
form_for_without_session_included(record_or_name_or_array,
*args, &proc)
else
proc_with_session = Proc.new{ proc.call.concat
(hidden_field_tag(:_session_id, session.session_id, :id => nil)) }
form_for_without_session_included(record_or_name_or_array,
*args, &proc_with_session)
end
end
alias_method_chain :form_for, :session_included
end
end
end

The problem seems to comes in in that the proc holds all the
FormHelper fields. These expect to wake up inside the form_for object,
so they do a lot of NoMethodError complaining when they get woken up
like this.

The only option that I’ve found that works is the aforementioned
simian solution of copying the whole form_for method in to the else
and adding an additional concat with my hidden_field. This just
smells too strongly of future maintenance headache, and so I’d like a
much neater solution.

I’m pretty new to procs beyond very simple usage, so any help or
suggestions would be greatly appreciated.

Thanks,
Todd

(Yes, that’s cookie-based sessions being overridden. Mobile phone
browsers are the spawn of satan).

On 19 Jan 2009, at 00:43, tatyree wrote:

module Helpers
*args, &proc_with_session)
end
end
alias_method_chain :form_for, :session_included
end
end
end

I would have thought something likw
form_for_without_session_included(record_or_name_or_array, *args) do |f|
hidden_field_tag …
proc.call(f)
end

would have done the trick. Monkey patching this in seems a little
unnecessary. You could just as easily write a helper_called
my_form_for and call that when you want this extra behaviour

Fred