2010-10-29 69 views
1

我有一個的form_for代碼fields_for犯規工作時的form_for使用符號

<%form_for :a,:url=>{:controller=>"biz/a",:action=>"save"},:html =>{:multipart => true} do |f| %> 
..... 
<%f.fields_for :b do |b|%> 
..... 
<%b.fields_for :apples do |apple|%> 
... 
<%end%> 
.... 
<%end%> 

它,當我的的form_for改變爲輸出的HTML代碼而不fields_for功能

<textarea cols="40" id="a_b_apples_content" name="a[b][apples][content]" rows="20" style="width:500px;height:100px;border:1px #889BAA solid;color:#999;font-size:12px;padding:6px;"></textarea> 

<%form_for @a,:url=>{:controller=>"biz/a",:action=>"save"},:html =>{:multipart => true} do |f| %> 

它只是工作正常。 它輸出:

<textarea cols="40" id="a_b_apples_content" name="a[b_attributes][apples_attributes][0][content]" rows="20" style="width:500px;height:100px;border:1px #889BAA solid;color:#999;font-size:12px;padding:6px;"></textarea> 

我想要的。 爲什麼不中的form_for做工精細的符號有什麼區別?在一個的form_for和@a。 謝謝。 我使用rails 2.3.8,ruby 1.8.7,chrome網頁瀏覽器。

+0

不確定,但也許該符號只允許屬性,而使用對象給你的關聯。 – Samo 2010-10-29 17:07:34

回答

1

這是挫折的常見原因。 form_for實際上根據是否傳遞一個符號或一個對象而有所不同。如果你傳遞一個符號,像這樣:

<% form_for :person do |f| %> 
    <% f.text_field :name %> 
<% end %> 

然後表單生成器的工作,但它只會設置帕拉姆值,如果存在@person加載默認值。您的parmas哈希看起來應該如下:

params = { 
    :person => { 
    :name => 'bob' 
    } 
} 

但它不會正確設置您的路線。它會假設你想提交到你已經在的同一頁面。現在,如果你給它一個對象,form_for將爲你做更多。它會檢查這個對象是新的還是正在更新,並且會相應地設置表單標籤的參數以及其他一些好處。

老實說,我不能告訴你爲什麼他們的行爲不同。符號版本顯然仍然可以訪問實例變量(上例中的@person),因爲這些字段將填充其現有值。簡單的解決方案是傳遞一個實例變量總是要走的路,並會正常工作。

+0

謝謝,我已經想通了。僅用於空白模型的符號。 – Vincent 2010-11-09 14:43:09