2010-02-06 27 views
25

Tôi có hai mô hình, liên kết và thẻ, được liên kết thông qua một phần ba, link_tags. Mã sau nằm trong mô hình Liên kết của tôi.accepts_nested_attributes_for với has_many =>: thông qua Tùy chọn

Hội:

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 Actions:

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 

Xem mã từ new.html.erb:

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

Và một phần tương ứng:

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

Các dòng mã sau đây, trong tạo hành động trong bộ điều khiển liên kết ném một lỗi:

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

Lỗi: Tag(#-621698598) expected, got Array(#-609734898)

Có bước bổ sung cần thiết trong has_many =>: thông qua trường hợp? Đây dường như là những thay đổi được chỉ định duy nhất cho trường hợp has_many cơ bản.

+0

Tôi không thể để tái tạo vấn đề của bạn dựa trên mã bạn đã đăng. Bạn có thể đăng các phần kết hợp (các dòng has_many/attribute_to/etc) của ba mô hình của bạn, cả các hành động điều khiển có liên quan (liên kết # mới, liên kết # tạo) và bất kỳ mã xem nào có liên quan đến biểu mẫu liên kết. – EmFi

+0

Tôi đã thêm mã cho các liên kết, hành động của bộ điều khiển và chế độ xem. Cảm ơn bạn đã giúp đỡ. –

Trả lời

1

Hãy thử điều này:

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

lỗi khác nhau bây giờ: 'phương pháp xác định' with_indifferent_access' cho "Mã hóa": String' Tham số: { "cam kết" => "Update", "authenticity_token" => "fwCGGgcTKOSfxpFJMXmq7IUfRtfOvdOKl31Xys4TKC8 =", liên kết " "=> {" tags_attributes "=> {" name "=>" Mã hóa "}, " uri "=>" http://stackoverflow.com ", " title "=>" Stack Overflow "}} Cám ơn vì sự gợi ý. Có một giải pháp cho điều này? Có phải nó đang cố gắng xử lý giá trị của một trong các thuộc tính dưới dạng băm không? –

+0

Có cách nào để có được định dạng phù hợp cho mớ hỗn độn đó không? –

+0

Bạn có thể dán toàn bộ biểu mẫu của mình – obiwanchinobi

0

Trong điều khiển của bạn trong hành động mới (có tải dưới dạng một phần), được bạn xây dựng một @tag thông qua liên kết của bạn?

Vì vậy, bạn sẽ thấy một cái gì đó dọc theo dòng:

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

Nó có thể là tốt nhất để đăng nội dung của các mới và tạo hành động của links_controller của bạn.

+0

Các hành động của bộ điều khiển hiện đang ở trong bài đăng gốc. Tôi không tạo thẻ trong hành động mới. Tôi đã theo dõi cùng với phần đa mô hình ở đây: http://guides.rubyonrails.org/getting_started.html, điều này không cho biết các thay đổi của bộ điều khiển sẽ là cần thiết. Điều đó nói rằng, biểu mẫu mới tự động tạo hộp thẻ, mặc dù không có bất kỳ thẻ nào. –

2

Để cho tiện làm việc, bạn cần phải vượt qua trong quyền params băm:

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

Và điều khiển của bạn sẽ trông giống như:

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

thử

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

(tức là mất các _attributes trong: tag_attributes) Đó là cách tôi thường thực hiện các hình thức lồng nhau

0

Bạn cần phải xây dựng một thẻ trong điều khiển của bạn hoặc trong chế độ

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

Hãy nhìn vào các dòng mã của bạn

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

Bạn cần phải sử dụng chỉ :tags thay vì :tags_attributes. này sẽ giải quyết vấn đề của bạn

Hãy chắc chắn rằng bạn đã xây dựng các liên kết và các thẻ trong điều khiển của bạn như

def new 
    @link = @current_user.links.build 
    @link.tags.build 
end 
Các vấn đề liên quan