2010-02-06 8 views
25

मेरे पास दो मॉडल, लिंक और टैग हैं, जो एक तिहाई, link_tags से जुड़े हैं। निम्नलिखित लिंक मेरे लिंक मॉडल में है।accepts_nested_attributes_for has_many => के साथ: विकल्प

संघों:

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 क्रियाएँ:

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 

देखें कोड new.html.erb से:

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

और आंशिक इसी:

<%= 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> 

कोड की निम्न पंक्ति, लिंक नियंत्रक में बनाने कार्रवाई में एक त्रुटि फेंकता है:

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

त्रुटि: Tag(#-621698598) expected, got Array(#-609734898)

वहाँ has_many में की जरूरत के लिए अतिरिक्त कदम हैं =>: मामले के माध्यम से? ये बुनियादी है_मेनी मामले के लिए एकमात्र संकेतित प्रतीत होते हैं। नई क्रिया (उस रूप आंशिक लोड हो जाता है), तो आप अपने लिंक के माध्यम से एक @tag निर्माण कर रहे हैं में

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

मैं कोड आपने पोस्ट किया है के आधार पर अपनी समस्या पुन: पेश करने में असमर्थ हूँ अपने नियंत्रक में लिंक और टैग का निर्माण किया है। क्या आप अपने तीन मॉडलों के एसोसिएशन पार्ट्स (has_many/belong_to/etc लाइन) पोस्ट कर सकते हैं, दोनों प्रासंगिक नियंत्रक क्रियाएं (लिंक # नया, लिंक # बनाएं) और किसी भी व्यू कोड को लिंक फॉर्म के साथ करना है। – EmFi

+0

मैंने एसोसिएशन, कंट्रोलर एक्शन और विचारों के लिए कोड जोड़ा है। आपकी सहायता के लिए धन्यवाद. अब –

उत्तर

1

इस प्रयास करें?

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

यह नए की सामग्री पोस्ट करने और अपने links_controller की कार्रवाई बनाने के लिए सबसे अच्छा हो सकता है:

तो तुम की तर्ज पर कुछ देखना चाहिए।

+1

विभिन्न त्रुटि: 'अपरिभाषित विधि 'with_indifferent_access'" कोडिंग "के लिए: स्ट्रिंग ' पैरामीटर: {" प्रतिबद्ध "=>" अपडेट ", " authenticity_token "=>" fwCGGgcTKOSfxpFJMXmq7IUfRtfOvdOKl31Xys4TKC8 = ", " लिंक "=> {" tag_attributes "=> {" name "=>" कोडिंग "}, " uri "=>" http://stackoverflow.com ", " शीर्षक "=>" स्टैक ओवरफ़्लो "}} सलाह के लिये धन्यवाद। क्या इसका कोई उपाय है? क्या यह एक हैश के रूप में गुणों के मूल्य का इलाज करने की कोशिश कर रहा है? –

+0

क्या उस गड़बड़ी के लिए उचित प्रारूपण करने का कोई तरीका है? –

+0

क्या आप अपना पूरा फॉर्म – obiwanchinobi

0

अपने नियंत्रक में:

+0

नियंत्रक कार्य अब मूल पोस्ट में हैं। मैं नई कार्रवाई में टैग नहीं बना रहा हूं। मैं यहां बहु-मॉडल अनुभाग के साथ अनुसरण कर रहा था: http://guides.rubyonrails.org/getting_started.html, जो नियंत्रक परिवर्तनों को इंगित नहीं करता था, आवश्यक होगा। उस ने कहा, किसी भी टैग की अनुपस्थिति के बावजूद, नया फॉर्म स्वचालित रूप से एक टैग बॉक्स उत्पन्न करता है। –

2

इस के लिए काम करने के लिए है, तो आप सही पैरामीटर हैश में पारित करने के लिए की जरूरत है:

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

और अपने नियंत्रक तरह दिखेगा:

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

कोशिश

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

(यानी _attributes को खो दें: tag_attributes) इस तरह मैंने आमतौर पर नेस्टेड फॉर्म

किया है
5

मैं stackoverflow पर यहाँ इस पाया:

Rails nested form with has_many :through, how to edit attributes of join model?

कृपया मुझे बताओ अगर यह काम किया।

+0

यह मेरा प्रश्न था (और मेरा जवाब) और मैं निश्चित रूप से आपको यह बता सकता हूं कि यह काम करता है :) – Arcolye

0

आप अपने नियंत्रक में या देखने

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

में एक टैग का निर्माण करने के लिए अपने कोड

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

की लाइन पर एक नज़र आप :tags_attributes सिर्फ :tags के बजाय उपयोग करने की आवश्यकता ले लो की जरूरत है। यह आपकी समस्या का समाधान होगा

सुनिश्चित करें कि आप की तरह

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