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

Ich render ein Formular für die Bearbeitung mit Partials.Warum werden Element-IDs in verschachtelter Form wiederholt?

Die Ansichten sind:

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] 

Wie behebe ich es so, dass die IDs kommen als user_profile[first_name] statt user_profile[user_profile][first_name]?

Antwort

1

Aus der Dokumentation für fields_for es ist:

geeignet ist, in der gleichen Form zusätzliche Modellobjekte angeben.

Mit einem Beispiel zeigt dieses Paradigma:

<%= 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 %> 

Hinweis form_for @person und fields_for @person.permission - fields_for sollte für eine Assoziation eines Modells verwendet werden, form_for sollte sich für das Modell verwendet werden. Der Grund dafür, dass Ihr HTML-Code als user_profile[user_profile] gerendert wird, ist, dass Sie @user_profile sowohl in form_for als auch in fields_for angeben.

Wahrscheinlich müssen Sie den Parameter in form_for in @user ändern (oder die äquivalente Variable, die Sie im Bereich haben). Dies wird Ihre Ausgabe html machen:

user[user_profile][first_name] 

die Sie Userscontroller # update passieren kann, solange Benutzer accepts_nested_attributes_for user_profile. Wenn Sie stattdessen den Parameter-Hash aus dem Formular an UserProfilesController # update übergeben möchten, müssen Sie die fields_for vollständig löschen und die Felder nur unter form_for @user_profile rendern - was Ihnen HTML-Code wie user_profile[first_name] gibt.

+0

Danke für diese Erklärung. Ich werde überdenken, wie ich Teiltöne in meiner App verwende. – Zabba