2010-02-06 5 views
25

Ho due modelli, collegamenti e tag, associati tramite un terzo, link_tags. Il seguente codice è nel mio modello Link.accetta_nested_attributes_for con has_many =>: attraverso le opzioni

Associazioni:

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 

Azioni 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 

vista Codice da new.html.erb:

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

e il corrispondente parziali:

<%= 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 seguente riga di codice, nell'azione creare nel controller di collegamento genera un errore:

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

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

ci sono passaggi aggiuntivi necessari nel has_many =>: attraverso il caso? Questi sembrano essere gli unici cambiamenti indicati per il caso base di has_many.

+0

non sono in grado di riprodurre il problema in base al codice che hai postato. Potresti postare le parti dell'associazione (has_many/belongs_to/etc lines) dei tuoi tre modelli, entrambe le azioni rilevanti del controller (link # new, links # create) e qualsiasi codice di visualizzazione che ha a che fare con il modulo links. – EmFi

+0

Ho aggiunto il codice per le associazioni, le azioni del controller e le viste. Grazie per l'aiuto. –

risposta

1

Prova questo:

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

errore diverso ora: 'metodo non definito 'with_indifferent_access' per "Codifica": String' Parametri: {=> "fwCGGgcTKOSfxpFJMXmq7IUfRtfOvdOKl31Xys4TKC8 =", collegamento "commit"=> "Aggiornamento", "authenticity_token" " "=> {" tags_attributes "=> {" name "=>" Coding "}, " uri "=>" http://stackoverflow.com ", " title "=>" Overflow dello stack "}} Grazie per il suggerimento. c'è una soluzione a questo? Sta cercando di considerare il valore di uno degli attributi come un hash? –

+0

C'è un modo per ottenere una formattazione corretta per quel casino? –

+0

Potete per favore incollare l'intero modulo – obiwanchinobi

0

Nel vostro controller nella nuova azione (che carica il modulo parziale), stai costruendo un @tag attraverso il vostro link?

Così si dovrebbe vedere qualcosa sulla falsariga di:

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

Potrebbe essere meglio per inviare il contenuto della nuova e di creare l'azione del vostro links_controller.

+0

Le azioni del controller sono ora nel post originale. Non sto creando il tag nella nuova azione. Stavo seguendo la sezione multi-modello qui: http://guides.rubyonrails.org/getting_started.html, che non indicava che sarebbero necessarie modifiche al controller. Detto questo, il nuovo modulo genera automaticamente una tag box, nonostante l'assenza di tag. –

2

Affinché ciò funzioni, è necessario passare in hash destra params:

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

E il controller sarà simile:

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

provare

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

(cioè perdere gli attributi _ in: tag_attributes) Ecco come ho fatto di solito i moduli nidificati

0

è necessario costruire un tag nel controller o nella vista

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

Date un'occhiata alla linea del codice

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

È necessario utilizzare solo :tags invece di :tags_attributes. Questo risolverà il problema

Assicurarsi che si dispone di costruire legami e tag nel controller come

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