2010-12-09 69 views
1
class User 
    has_one :user_profile 
end 
class UserProfile 
    belongs_to :user 
end 

我正在渲染一個窗體,用於使用partials進行編輯。爲什麼<input>元素ID以嵌套形式重複?

的意見是:

user_profile/edit.html.erb 
-------------------------- 
<%= render 'form' %> 

user_profile/_form.html.erb 
--------------------------- 
<%= form_for @user_profile do |f| %> 
    <%= f.fields_for @user_profile do |builder| %> 
    <%= render :partial => 'user_profiles/fields', :locals => { :f => builder } %> 
    # id is correct i.e. [user_profile][last_name] for the field below 
    <%= f.text_field :last_name %> 
    <% end %> 
    <%= f.submit %> 
<% end %> 


user_profile/_fields.html.erb 
----------------------------- 
<%= f.text_field :first_name %> 
<%= f.text_field :last_name %> 

# id's for the above fields are rendered as: 
# user_profile[user_profile][first_name] 
# notice the second repeated [user_profile] 

如何解決它,這樣的ID的問世爲user_profile[first_name]而不是user_profile[user_profile][first_name]

回答

1

從文檔fields_for它是:

適於以相同的形式指定附加模型對象。

隨着表示本範例的例子:

<%= form_for @person do |person_form| %> 
    First name: <%= person_form.text_field :first_name %> 
    Last name : <%= person_form.text_field :last_name %> 

    <%= fields_for @person.permission do |permission_fields| %> 
    Admin? : <%= permission_fields.check_box :admin %> 
    <% end %> 
<% end %> 

通知form_for @personfields_for @person.permission - fields_for應該用於一個模型的關聯,的form_for應該用於模型本身。您的html呈現爲user_profile[user_profile]的原因是您在form_forfields_for中都指定了@user_profile

您可能需要將form_for中的參數更改爲@user(或您在範圍內的等效變量)。這會讓你的HTML輸出:

user[user_profile][first_name] 

,你只要能傳遞到UsersController#更新爲用戶accepts_nested_attributes_for user_profile。如果您想要將參數哈希從表單傳遞給UserProfilesController#update,那麼您希望完全刪除fields_for,並只顯示form_for @user_profile下的字段 - 這會爲您提供像user_profile[first_name]這樣的html。

+0

感謝您的解釋。我會重新考慮我在我的應用中如何使用partials。 – Zabba 2010-12-09 22:55:50