在深入研究ruby的嵌套模型时,我遇到了一个问题。
考虑以下情况,
我有以下型号:
具有以下规格:
作者:
class Author < ActiveRecord::Base
attr_accessible :name
has_many :books, dependent: :destroy
accepts_nested_attributes_for :books #I read this is necessary here: http://stackoverflow.com/questions/12300619/models-and-nested-forms
# and some validations...
end
图书:
class Book < ActiveRecord::Base
attr_accessible :author_id, :name, :year
belongs_to :author
#and some more validations...
end
我想向作者添加一本书。这是我的authors_controller:
def new_book
@author = Author.find(params[:id])
end
def create_book
@author = Author.find(params[:id])
if @author.books.create(params[:book]).save
redirect_to action: :show
else
render :new_book
end
end
这是我尝试这样做的形式:
<h1>Add new book to <%= @author.name %>'s collection</h1>
<%= form_for @author, html: { class: "well" } do |f| %>
<%= fields_for :books do |b| %>
<%= b.label :name %>
<%= b.text_field :name %>
<br/>
<%= b.label :year %>
<%= b.number_field :year %>
<% end %>
<br/>
<%= f.submit "Submit", class: "btn btn-primary" %>
<%= f.button "Reset", type: :reset, class: "btn btn-danger" %>
<% end %>
问题: 当我输入数据并单击“提交”时,它甚至会将我重定向到正确的作者,但它不会为该作者保存新记录。 经过大量的研究,我似乎无法找到我在这里做错了什么。
答案 0 :(得分:1)
将authors_controller更改为:
def new_book
@author = Author.find(params[:id])
@book = Book.new
end
您的表格:
<h1>Add new book to <%= @author.name %>'s collection</h1>
<%= form_for ([@author, @book]), html: { class: "well" } do |f| %>
并且,routes.rb
resources :authors do
resources :books
end
答案 1 :(得分:1)
你错过了几件事。
控制器:
...
def new_book
@author = Author.find(params[:id])
@author.books.build
end
...
查看,它是f.fields_for
而不只是fields_for
:
<%= f.fields_for :books do |b| %>
<%= b.label :name %>
<%= b.text_field :name %>
<br/>
<%= b.label :year %>
<%= b.number_field :year %>
<% end %>
答案 2 :(得分:1)
您还需要在作者模型可访问方法上添加:nested_attributes_for_books
。作者控制器上的create方法不需要任何代码添加就可以了。
注意:您将Books控制器设置为在成功时呈现'books#show'。如果应用程序将您重定向到作者,这意味着作者控制器正在处理书籍的创建,除非您将其设置为重定向到作者而不是书籍。