2013-07-27 71 views
2

是否有一種方法可以將隱藏的輸入字段添加到在軌道中在視圖中聲明的所有窗體。隱藏字段需要具有由控制器中的公共屬性傳遞的值。基本上我想要任何由Web服務器作爲響應給出的表單,以具有額外的隱藏輸入元素。向軌道中的所有窗體添加隱藏的輸入字段

我該怎麼做?我可以用某種方式覆蓋form_for嗎?或者我可以用部分中的表單包裝來強制每個人使用部分?

回答

4

編輯:好的,我的第一次傳遞不起作用,因爲你不能在初始化器中定義一個值,你稍後要從控制器傳入。所以你可以通過兩種方式來解決這個問題。 您可以定義CustomFormBuilder類 - 把它放在一個初始化 -

class CustomFormBuilder < ActionView::Helpers::FormBuilder 
    def submit(value, options = {}) 
    @template.hidden_field_tag(options.delete(:custom_param)) + super 
    end 
end 

然後通過:builder選項form_for

form_for @whatever, builder: CustomFormBuilder 

,並假設你的形式,其中的選項包括您CUSTOM_PARAM打電話submit(value, options),它將被自定義方法覆蓋,該方法將隱藏字段插入到所需的值中。

另一種方法是猴補丁猴補丁FormTagHelper代替:

module ActionView::Helpers::FormTagHelper 

    def extra_tags_for_form_with_custom_param(html_options) 
    hidden_field_tag(html_options.delete('custom_param') + 
    extra_tags_for_form_without_custom_param(html_options) 
    end 
    alias_method_chain :extra_tags_for_form, :custom_param 
end 

這就是調整的代碼form_for使用在每一個表格的頂部插入真實性令牌。現在你可以在控制器中設置它作爲一個實例變量之後傳遞的自定義參數去form_for

form_for @object, custom_param: @custom_param do |f| 

如果您在使用Ruby 2.0+那麼你可以使用模塊前插,而不是過時的alias_method_chain例如

module CustomParamFormPatch 
    private 
    def extra_tags_for_form(html_options) 
    hidden_field_tag(html_options.delete('custom_param')) + 
    super 
    end 
end 

ActionView::Base.prepend(CustomParamFormPatch) 
+0

我試着指定submit_Tag(value,options = {})。它似乎不呈現隱藏的輸入元素。我還添加了一條似乎不起作用的日誌聲明。我正確地附加了建造者。我的表單全部使用submit_tag。我錯過了什麼? – gnarsi

+0

'submit_tag'沒有在FormBuilder類中定義,'submit'是。由於'submit_tag'被調用...實際上我不確定哪些對象調用了這些* _tag方法,@template也許 - 我不認爲你可以繼承它。你必須在FormTagHelper類中修飾'submit_tag',這對我來說更加脆弱。任何你不僅僅使用'submit'的理由? – bgates

+0

我不確定爲什麼它不是首先提交。我現在將其轉換爲提交。但是有沒有一種方法可以訪問當前的控制器實例並得到像我這樣的屬性?我沒有找到辦法做到這一點。 – gnarsi