我正在尝试构建一个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
感谢您的帮助。
答案 0 :(得分:0)
表单中的第一个参数不能包含nil或为空
这表示表单中的@read
为nil
。由于您处于Books控制器的show动作中,因此必须在books控制器中定义此变量。
def show
@read = Read.new
...
end