2010-02-02 12 views
102

accepts_nested_attributes_for kullanırken birleştirme modelinin niteliklerini nasıl düzenlersiniz? İç içe geçme formu has_many: ile, birleştirme modelinin niteliklerini nasıl düzenler?

Ben 3 modelleri var: Bağlayıcılardan
class Topic < ActiveRecord::Base 
    has_many :linkers 
    has_many :articles, :through => :linkers, :foreign_key => :article_id 
    accepts_nested_attributes_for :articles 
end 
class Article < ActiveRecord::Base 
    has_many :linkers 
    has_many :topics, :through => :linkers, :foreign_key => :topic_id 
end 
class Linker < ActiveRecord::Base 
    #this is the join model, has extra attributes like "relevance" 
    belongs_to :topic 
    belongs_to :article 
end 

katıldı Konular ve Makaleler Yani konular kumandanın "yeni" eylem makaleyi ...

@topic.articles.build 

oluştururken .. .ve ...

<% form_for(@topic) do |topic_form| %> 
    ...fields... 
    <% topic_form.fields_for :articles do |article_form| %> 
    ...fields... 

konular/new.html.erb iç içe geçmiş formu yapmak ... Raylar otomatik bağlayıcı yaratan i harika. Soru için şimdi: Benim Linker modelinde de "yeni konu" formu ile değiştirmek isteyebileceğim nitelikler var. Ancak Rails'in otomatik olarak oluşturduğu linker, topic_id ve article_id dışındaki tüm nitelikler için geçersiz değerlere sahiptir. Diğer linker özniteliklerine "yeni konu" formuna nasıl yer açabilirim ki, onlar nil gelmiyorlar?

+3

: kaydı oluşturma

topic[name] topic[linkers_attributes][0][is_active] topic[linkers_attributes][0][article_attributes][title] 

gibi şimdi de basittir: sunucuya gönderilir form alanı tuşları şuna benzer çünkü, bu Sen sadece yeni bir eylem oluştur, sen kontrolör eylemlerini paylaşıp paylaşamayacağını merak ediyorum. "İlişki" yi "Bağlayıcı" olarak kullanarak "Hesap" üzerinden bir "Kullanıcı" oluşturmak istiyorum ... ama yeni ve oluşturucu eylemlerin neye benzemesi gerektiğini anlayamıyorum. ? – Mohamad

+0

https://robots.thoughtbot.com/accepts-nested-attributes-for-with-has-many-through – zx1986

cevap

89

Yanıtı çözdünüz. hile olduğunu:

bağlayıcıları oluşturur
@topic.linkers.build.build_article 

, daha sonra her yönlendirisi makaleye oluşturur. Yani, model:
accepts_nested_attributes_for :linkers
linker.rb ihtiyacı topic.rb formda Sonra accepts_nested_attributes_for :article

gerekir:

<%= form_for(@topic) do |topic_form| %> 
    ...fields... 
    <%= topic_form.fields_for :linkers do |linker_form| %> 
    ...linker fields... 
    <%= linker_form.fields_for :article do |article_form| %> 
     ...article fields... 
+13

Yararlı olursa bu bana yardımcı olur – Arcolye

+13

Raylar 3 güncellemesi: form_for ve field_for yerine <% %> gerekiyorsa Rails 3'ü kullanıyorsunuz. – Arcolye

+0

Eklediğiniz iki accepts_nested_attributes_deri etrafında kod backticks eklerim. Kodu okurken bu bilgiyi tekrar tekrar özledim - bir kere okuduktan sonra detayı kaçırdım ve problemimi çözdüm. Teşekkürler! –

3

Hızlı GOTCHA çözümünüzdeki has_one kullanılırken. this thread'da kullanıcı tarafından verilen yanıtı KandadaBoggu'a yapıştırın.


build yöntem imzası has_one ve has_many dernekler için farklıdır.

class User < ActiveRecord::Base 
    has_one :profile 
    has_many :messages 
end 

has_many dernek için inşa sözdizimi:

user.messages.build 

has_one dernek için inşa sözdizimi:

user.build_profile # this will work 

user.profile.build # this will throw error 

fazla ayrıntı için has_one dernek documentation okuyun.

Raylar tarafından oluşturulan form Raylar controller#action gönderilir
6

, params buna benzer bir yapıyı (ilave bazı oluşan nitelikler) sahip olacaktır:

params = { 
    "topic" => { 
    "name"    => "Ruby on Rails' Nested Attributes", 
    "linkers_attributes" => { 
     "0" => { 
     "is_active"   => false, 
     "article_attributes" => { 
      "title"  => "Deeply Nested Attributes", 
      "description" => "How Ruby on Rails implements nested attributes." 
     } 
     } 
    } 
    } 
} 

linkers_attributes aslında sıfır endeksli nasıl Bildirimi String tuşları ile ve Array değil?Aynı şeyi yapmaya çalışıyorum

TopicController < ApplicationController 
    def create 
    @topic = Topic.create!(params[:topic]) 
    end 
end 
+0

Emin değilim, ama bunun kabul edildiğini düşünüyorum 'accepts_nested_attributes_for' – Arcolye

+2

@Arcolye - Böyle bir dernek için internette bu bilgiyi bulmak o kadar acı vericiydi - belki benim google-fu'm o gün kapalı. En azından iş arkadaşım olarak bu belgeyi burada belgelemek istedim ve sadece radarların linked_attributes öğelerini sıfıra endeksli bir karma yerine bir diziye dönüştürdüğünü varsaydım. Umarım bu tidbit gelecekte birisine yardımcı olur :) –