2010-02-06 18 views
25

Üçüncü bir link_tags ile ilişkilendirilmiş iki model, bağlantı ve etiket var. Aşağıdaki kod Bağlantı modelimde.has_many ile accepts_nested_attributes_for =>: yoluyla Seçenekler

Birlikler: new.html.erb gelen

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 

Profil kod:

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 

links_controller Eylemler

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

ve karşılık gelen kısmi:

<%= 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> 
Bağlantı denetleyicisi oluşturmak eylem

aşağıdaki kod satırı bir hata atar:

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

hatası: Tag(#-621698598) expected, got Array(#-609734898)

has_many gerekli ek adımlar var mı =>: örneği üzerinden? Bunlar, temel has_many durumu için gösterilen tek değişiklik olarak görünüyor.

+0

gibi denetleyici bağlantıları ve etiketleri oluşturmak olduğundan emin olun Sorununuz çözecektir. Üç modelinizin ilişkilendirme bölümlerini (has_many/belongs_to/etc satırları), ilgili denetleyici eylemlerini (bağlantı # yeni, bağlantılar # oluşturma) ve bağlantı formuyla ilgili olan tüm görünüm kodlarını kaydedebilirsiniz. – EmFi

+0

İlişkilendirmeler, denetleyici eylemleri ve görünümlerin kodunu ekledim. Yardım ettiğin için teşekkür ederim. Şimdi –

cevap

1

bu deneyin: Kumandanızda olarak

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

Farklı hatası: "Kodlama" için 'tanımsız yöntem 'with_indifferent_access': String' Parametreler: {, "authenticity_token"=> "Güncelle" "taahhüt"=> "fwCGGgcTKOSfxpFJMXmq7IUfRtfOvdOKl31Xys4TKC8 =", "bağlantısı "=> {" tags_attributes "=> {" name "=>" Kodlama "}, " uri "=>" http://stackoverflow.com ", " title "=>" Yığın Taşması "}} Önerin için teşekkürler. Bunun bir çözümü var mı? Özniteliklerden birinin değerini bir karma olarak ele almaya mı çalışıyor? –

+0

Bu karmaşa için uygun biçimlendirmenin bir yolu var mı? –

+0

Tüm formunuzu – obiwanchinobi

0

yeni eylem (yani kısmi formu yükler), kendi bağlantı üzerinden bir @tag inşa ediyoruz mi? Yeni içeriğini gönderebilir ve links_controller eylemini oluşturmak için iyi olabilir

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

:

Yani çizgisinde bir şey görmek gerekir. Bunun çalışması için Amacıyla

+0

Denetleyici eylemleri artık orijinal yayında. Yeni eylemde etiket oluşturmuyorum. Burada çok modelli bölümle birlikte: http://guides.rubyonrails.org/getting_started.html, kontrolör değişikliklerinin gerekli olmadığını belirtiyordu. Bu, yeni formun, herhangi bir etiketin olmamasına rağmen otomatik olarak bir etiket kutusu oluşturduğunu söyledi. –

2

, doğru parametreler karma geçmek gerekir:

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

Ve kontrolör gibi görünecektir:

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

deneyin

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

(yani _attributes in: tag_attributes). Genellikle nasıl iç içe geçmiş formlar yaptım

0

Sen sadece :tags yerine :tags_attributes kullanımına gerek kodunuzda

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

hattında bir göz atın controller içerisinde veya görünüm

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

bir etiketi oluşturmak gerekir. Bu

Sen seni gönderdiniz koduna göre senin sorunu yeniden alamıyorum

def new 
    @link = @current_user.links.build 
    @link.tags.build 
end 
İlgili konular