0

我正在尝试构建一个 form_for 来创建其他两个模型之间的连接模型。我有一个 Book 模型和一个 User 模型,另一个叫做 Reads 是我的加入。这是我设置关联的方式:

class User < ActiveRecord::Base
  has_many :reads
  has_many :books, :through => :reads
end

class Book < ActiveRecord::Base
  has_many :reads
  has_many :users, :through => :reads
end

class Read < ActiveRecord::Base
  belongs_to :book
  belongs_to :user
end

我查看了 form_for 的文档并观看了关于多对多关联的 railscast 剧集,但我无法弄清楚为什么在我尝试渲染 Book#show 视图时出现错误把表格:

First argument in form cannot contain nil or be empty

这是我在 app/views/books/show.html.erb 中的表单:

<%= form_for(@read) do |f| %>
  <%= f.hidden_field :book_id, value: @book.id %>
  <%= button_to 'Add to Reads', {controller: 'reads', action: 'create'}, {class: 'btn'} %>
<% end %>

我认为部分问题是我试图从 Books 模型创建一个“读取”对象,但我不确定我做错了什么。我需要图书页面上的“添加到阅读”按钮,以便用户可以选择该特定图书以添加到他们的“阅读”中。我还在控制器中添加 current_user id,而不是在视图中。如果有帮助,这是我从读取控制器创建的操作...

def create
  @read = Read.new(read_params)
  @read.user_id = current_user.id
  @read.save
  if @read.save
    # do this
  else
    # do that
  end
end

而且我正在使用强大的参数...

def read_params
  params.require(:read).permit(:user_id, :book_id)
end

谢谢你的帮助。

4

1 回答 1

0

表单中的第一个参数不能包含 nil 或为空

这意味着@read在您的表单中是nil. 由于您处于 Books 控制器的显示操作中,因此您必须在 books 控制器中定义此变量。

def show
  @read = Read.new
  ...
end
于 2013-06-05T00:45:20.177 回答