Je ces modèles:Ne peut pas obtenir emboîtées avec une association has_one pour travailler
class User < ActiveRecord::Base
has_one :city
accepts_nested_attributes_for :city
end
class City < ActiveRecord::Base
belongs_to :user
end
Cette action du contrôleur:
def create
@user = User.new(params[:user])
respond_to do |format|
if @user.save
format.html { redirect_to(@user, :notice => 'User was successfully created.') }
format.xml { render :xml => @user, :status => :created, :location => @user }
else
format.html { render :action => "new" }
format.xml { render :xml => @user.errors, :status => :unprocessable_entity }
end
end
end
et ce point de vue:
<%= form_for :user,:url => users_path,:method => :post do |f| %>
<%= f.fields_for :city do |b| %>
<%= b.collection_select :id,City.all,:id,:name %>
<% end %>
<div class="field">
<%= f.label :name %><br />
<%= f.text_field :name %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
Je suis en train pour permettre à l'utilisateur de sélectionner une ville dans la liste des villes déjà ajoutées. J'essaie de lui présenter un select. La partie select cela fonctionne, mais le code HTML généré pour elle, ressemble à ceci:
<select name="user[city][id]" id="user_city_id">
<option value="1">One</option>
<option value="2">Two</option>
</select>
Notez que son nom n'a pas attribute
nulle part. Ainsi, quand j'essaye de le sauver, j'obtiens cette erreur:
City(#37815120) expected, got ActiveSupport::HashWithIndifferentAccess(#32969916)
Comment puis-je résoudre ce problème?
EDIT: il y a des progrès, j'ai essayé de changer le fields_for à ceci:
<%= f.fields_for :city_attributes do |b| %>
<%= b.collection_select :id,City.all,:id,:name %>
<% end %>
et maintenant, le code html semble générer correctement. Mais j'obtenir cette erreur maintenant:
Couldn't find City with ID=1 for User with ID=
Je ne sais pas quoi faire.
EDIT2: redéfinissant la méthode city_attributes=
semble fonctionner:
def city_attributes=(attribs)
self.city = City.find(attribs[:id])
end
Je ne sais pas si c'est le chemin à parcourir, mais il semble bon.
Merci. Tu as sauvé mon temps! – oivoodoo