为什么<input />元素ID以嵌套形式重复?

时间:2010-12-09 10:13:00

标签: ruby-on-rails-3 nested-forms

class User
    has_one :user_profile
end
class UserProfile
    belongs_to :user
end

我正在渲染一个用于使用局部编辑的表单。

观点是:

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 个答案:

答案 0 :(得分: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]的原因是您在@user_profileform_for中都指定了fields_for

您可能需要将form_for中的参数更改为@user(或您在范围内的等效变量)。这将使您的输出html:

user[user_profile][first_name]

只要用户accepts_nested_attributes_for user_profile,您就可以将其传递给UsersController #update。如果你想将参数哈希从表单传递给UserProfilesController #update,那么你想完全删除fields_for并只显示form_for @user_profile下的字段 - 这将为你提供像{{1}这样的html }}