0

J'ai un tel code dans new.erb.html:Ruby on rails: fields_for ne rien faire si submodel_attributes = défini

<% form_for(@ratification) do |f| %> 
    <%= f.error_messages %> 

    <% f.fields_for :user do |fhr| %> 
    <p> 
     <%= fhr.label :url %><br /> 
     <%= fhr.text_field_with_auto_complete :url %> 
    </p> 
    <% end %> 
<% end %> 

Si j'ai Ratification.rb vide est ok, ok fields_for fonctionne.

Mais si je l'ai écrit:

class Ratification < ActiveRecord::Base 
    belongs_to :user 
    accepts_nested_attributes_for :user 
end 

ou

class Ratification < ActiveRecord::Base 
    belongs_to :user 
    def user_attributes=(attr) 
    ... 
    end 
end 

f.fields_for rien de rendement! Pourquoi!?

Rails: 2.3.8

Plugin pour autocomplete: repeated_auto_complete

+0

J'ai édité ma réponse ... –

Répondre

0

Je crois que vous devez construire un utilisateur dans votre contrôleur, comme

# controller 
def new 
    @ratification = Ratification.new 
    @ratification.build_user 
end 

Qu'en est-

<% f.fields_for :user, @ratification.user do |fhr| %> 
    # ... 
<% end %> 

?

Je crois que si vous utilisez

<% f.fields_for :user do |fhr| %> 

vous devriez avoir @user comme variable d'instance. Mais dans votre cas, vous avez @ratification.user.

+0

Non, cette solution ne m'aide pas ... – petRUShka

0

Vous ne pouvez pas redéfinir user_attributes puisque vous écrasez le comportement standard spécifié par ActiveRecord. Si vous le savez toujours, vous devez redéfinir user_attributes en utilisant alias_method_chain.

0

N'avez-vous pas tort? Si la ratification appartient à un utilisateur, le modèle d'utilisateur doit accepter les attributs imbriqués pour les ratifications, et non l'inverse.

Ainsi, si les utilisateurs ont de nombreuses ratifications et si vous souhaitez soumettre plusieurs ratifications pour un utilisateur dans un formulaire unique, vous devez accepter les attributs imbriqués pour la ratification dans le modèle utilisateur.

Et vous feriez quelque part dans le contrôleur utilisateurs

@user = User.new 
2.times { @user.ratifications.build } # if you want to insert 2 at a time 

J'ai essayé de faire quelque chose de similaire dans la console:

@user = User.new 
@user.ratifications.build # this works 

Mais si je ne

@ratification = Ratification.new 
@ratification.user.build # this fails 
0

Je viens rencontré le même problème et a été en mesure de le réparer.Le problème était que fields_for prend :user comme argument alors que l'argument doit être @ratification.user

Par conséquent, remplacer

<% f.fields_for :user do |fhr| %> 

avec

<% f.fields_for @ratification.user do |fhr| %> 

Voilà.

4

ajouter juste un = (EQUAL) après <% dans le f.fields_for

comme ceci:

<%= f.fields_for :user do |fhr| %> 
    <p> 
     <%= fhr.label :url %><br /> 
     <%= fhr.text_field_with_auto_complete :url %> 
    </p> 
<% end %> 

obs: vous devez faire la même chose dans Rails 3

+0

merci !! J'ai totalement raté ça! –