通过参数错误导出form_for和has_many

时间:2013-06-04 23:55:24

标签: ruby-on-rails

我正在尝试构建一个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 view时,我无法弄清楚为什么我收到错误我把表格放在了:

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模型创建一个'Reads'对象,但我不确定我做错了什么。我需要书籍页面上的“添加到阅读”按钮,以便用户可以选择要添加到“阅读”的特定书籍。我也在控制器中添加current_user id,而不是在视图中添加。这是我从Reads控制器创建的动作,如果这有帮助...

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

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

  

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

这表示表单中的@readnil。由于您处于Books控制器的show动作中,因此必须在books控制器中定义此变量。

def show
  @read = Read.new
  ...
end