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).

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

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