2

覆蓋form_for的最佳方法是什麼?如何修改Rails 3表單生成器

例如,在每一個form_for(@post)

我想自動設置<form> id屬性@post.object_id

,並添加以下字段:hidden_field_tag :form_id, @post.object_id

我能做到這一點使用alias_method_chain

回答

3

從技術上講,你可能通過使用alias_method_chain來實現你的目標,但它需要解析表單並注入/修改內容,這可能會變得非常難看,非常快。

相反,我會建議用您自己的自定義版本覆蓋form_for(通過點擊底部的「show source」可以看到原始源http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-form_for)。實現這一

一種方式在後說明我最近寫了:http://davidsulc.com/blog/2011/05/01/self-marking-required-fields-in-rails-3/

區別在於:不是重寫label方法,你會重寫form_for方法。

P.S .:出於好奇,爲什麼你需要暴露object_id

+0

是否有使用OBJECT_ID任何問題? – deb 2011-05-25 20:03:04

+0

好吧,'object_id'基本上是Ruby的內部業務。 Ruby中很少有需要使用'object_id'的情況,我想不出爲什麼需要在Rails中公開它的原因。另外,對於給定的數據庫記錄,每次將其加載到內存中時,oject_id基本上都會有所不同(您可以通過在Rails控制檯中重複調用「Post.first.object_id」來嘗試)。我只是想,可能有更好的方法來實現你的目標(不管它是什麼)比使用'object_id'屬性... – 2011-05-26 12:47:39

2

這應該工作(它的工作對我來說):

<%= hidden_field(:post :form_id, :value => @post.object_id) %> 
0

在Rails的助手,你可以簡單地這樣做:

def form_for(record, options = {}, &block) 
    options[:id] = record.class.to_s + '-' + record.id 
    super 
end