2010-02-06 7 views
25

J'ai deux modèles, des liens et des balises, associés par un tiers, link_tags. Le code suivant est dans mon modèle de lien.accepte_nested_attributes_for avec has_many =>: par Options

Associations:

class Link < ActiveRecord::Base 
    has_many :tags, :through => :link_tags 
    has_many :link_tags 

    accepts_nested_attributes_for :tags, :allow_destroy => :false, 
    :reject_if => proc { |attrs| attrs.all? { |k, v| v.blank? } } 
end 

class Tag < ActiveRecord::Base 
    has_many :links, :through => :link_tags 
    has_many :link_tags 
end 

class LinkTag < ActiveRecord::Base 
    belongs_to :link 
    belongs_to :tag 
end 

Actions links_controller:

def new 
    @link = @current_user.links.build 
    respond_to do |format| 
     format.html # new.html.erb 
     format.xml { render :xml => @link } 
    end 
    end 

    def create 
    @link = @current_user.links.build(params[:link]) 

    respond_to do |format| 
     if @link.save 
     flash[:notice] = 'Link was successfully created.' 
     format.html { redirect_to links_path } 
     format.xml { render :xml => @link, :status => :created, :location => @link } 
     else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @link.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

Voir le code de new.html.erb:

<% form_for [current_user, @link], :url => account_links_path do |f| %> 
<%= render :partial => "form", :locals => { :f => f } %> 
<% end %> 

Et le partiel correspondant:

<%= f.error_messages %> 

    <p> 
    <%= f.label :uri %><br /> 
    <%= f.text_field :uri %> 
    </p> 
    <p> 
    <%= f.label :title %><br /> 
    <%= f.text_field :title %> 
    </p> 

    <h2>Tags</h2> 
    <% f.fields_for :tags_attributes do |tag_form| %> 
    <p> 
    <%= tag_form.label :name, 'Tag:' %> 
    <%= tag_form.text_field :name %> 
    </p> 
    <% unless tag_form.object.nil? || tag_form.object.new_record? %> 
    <p> 
    <%= tag_form.label :_delete, 'Remove:' %> 
    <%= tag_form.check_box :_delete %> 
    </p> 
    <% end %> 
    <% end %> 

    <p> 
    <%= f.submit 'Update' %> 
    </p> 

La ligne de code suivante, dans l'action create dans le contrôleur de lien renvoie une erreur:

@link = @current_user.links.build(params[:link]) 

L'erreur: Tag(#-621698598) expected, got Array(#-609734898)

Y at-il des mesures supplémentaires nécessaires dans le has_many =>: par cas? Ceux-ci semblent être les seuls changements indiqués pour le cas de base has_many.

+0

Je suis incapable de reproduire votre problème en fonction du code que vous avez posté. Pourriez-vous publier les parties de l'association (has_many/belongs_to/etc lines) de vos trois modèles, les deux actions du contrôleur pertinentes (liens # nouveau, liens # créer) et tout code de vue qui a à voir avec le formulaire de liens. – EmFi

+0

J'ai ajouté le code pour les associations, les actions du contrôleur et les vues. Merci de votre aide. –

Répondre

1

Essayez ceci:

<% f.fields_for :tags_attributes do |tag_form| %> 
+1

erreur CHANGÉ: 'méthode non définie de with_indifferent_access' pour "codage": String » Paramètres: { "commit"=> "Mise à jour", "authenticity_token"=> "fwCGGgcTKOSfxpFJMXmq7IUfRtfOvdOKl31Xys4TKC8 =", « lien "=> {" tags_attributes "=> {" name "=>" Codage "}, " uri "=>" http://stackoverflow.com ", " title "=>" Stack Overflow "}} Merci pour la suggestion. Y a-t-il une solution à cela? Est-ce qu'il essaie de traiter la valeur de l'un des attributs comme un hachage? –

+0

Existe-t-il un moyen d'obtenir un formatage correct pour ce désordre? –

+0

Pouvez-vous s'il vous plaît coller votre formulaire entier – obiwanchinobi

0

Dans votre contrôleur dans la nouvelle action (qui charge la forme partielle), construisez-vous un @tag via votre lien?

Vous devriez voir quelque chose le long des lignes de:

@link = Link.new 
@tag = @link.tags.build 

Il pourrait être préférable d'afficher le contenu de la nouvelle et de créer une action de votre links_controller.

+0

Les actions du contrôleur sont maintenant dans le message d'origine. Je ne crée pas le tag dans la nouvelle action. Je suivais la section multi-modèles ici: http://guides.rubyonrails.org/getting_started.html, qui n'indiquait pas que des changements de contrôleurs seraient nécessaires. Cela dit, le nouveau formulaire génère automatiquement une boîte de balises, malgré l'absence de balises. –

2

Pour que cela fonctionne, vous devez passer dans le droit de hachage:

params = { 
    :link => { 
    :tags_attributes => [ 
     {:tag_one_attr => ...}, {:tag_two_attr => ...} 
    ], 
    :link_attr => ... 
    } 
} 

Et votre contrôleur ressemblera:

def create 
    @link = Link.create(params[:link]) # this will automatically build the rest for your 
end 
0

essayer

<% f.fields_for :tags do |tag_form| %> 

(c'est à dire perdre les _attributs dans: tag_attributes) C'est comme ça que j'ai fait des formes imbriquées

0

Vous devez construire une balise dans votre contrôleur ou dans la vue

def new 
    @link = @current_user.links.build 
    @link.tags.build 
end 

#in your view you can just use the association name 
<% f.fields_for :tags do |tag_form| %> 
7

Jetez un oeil à la ligne de votre code

<% f.fields_for :tags_attributes do |tag_form| %> 

Vous devez juste utiliser :tags au lieu de :tags_attributes. Cela permettra de résoudre votre problème

Assurez-vous que vous avez créer des liens et des balises dans votre contrôleur comme

def new 
    @link = @current_user.links.build 
    @link.tags.build 
end