0

在研究 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

我想为作者添加一本书。这是我的作者控制器:

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

问题: 当我输入数据并单击“提交”时,它甚至会将我重定向到正确的作者,但它不会为该作者保存新记录。经过大量研究,我似乎无法在这里找到我做错了什么。

4

3 回答 3

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  
于 2012-10-18T20:43:53.960 回答
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 %>
于 2012-10-18T20:54:33.973 回答
1

您还需要:nested_attributes_for_books在 Author 模型上添加可访问的方法。Author 控制器上的 create 方法不需要添加任何代码即可开始。

注意:您将 Books 控制器设置为在成功时呈现“books#show”。如果应用程序将您重定向到作者,这意味着作者控制器正在处理书籍的创建,除非您将其设置为重定向到作者而不是书籍。

于 2012-10-18T21:35:26.247 回答