我正在努力在我的上安装acts_as_commentable插件 Rails 3 app。
在我的图书模型中添加“acts_as_commentable”后,我添加了一个 评论表在我的书上显示视图:
<% form_for(@comment) do|f| %>
<%= f.hidden_field :book_id %>
<%= f.label :comment %><br />
<%= f.text_area :comment %>
<%= f.submit "Post Comment" %>
<% end %>
然后在控制器(comments_controller.rb)中,
def create
@comment = Comment.new(params[:comment])
Book.comments.create(:title => "First comment.", :comment => "This
is the first comment.")
end
然后在提交评论时,它会返回错误:“未知 属性:book_id“ 从日志中:
Processing by CommentsController#create as HTML
Parameters: {"comment"=>{"comment"=>"WOOOW", "book_id"=>"32"},
"commit"=>"Post Comment",
"authenticity_token"=>"5YbtEMpoQL1e9coAIJBOm0WD55vB2XRZMJa4MMAR1YI=",
"utf8"=>"✓"}
Completed in 11ms
ActiveRecord::UnknownAttributeError (unknown attribute: book_id):
app/controllers/comments_controller.rb:3:in `new'
app/controllers/comments_controller.rb:3:in `create'
建议?
答案 0 :(得分:3)
<%= f.hidden_field :book_id %>
这表示您的Comment
模型没有book_id
字段。
此外,将字段称为模型名称(注释)并不是一个好主意。对于应包含邮件正文的字段,请使用body
(或message
)代替comment
。
答案 1 :(得分:2)
我认为你必须选择:
选项1) 观点:
<% form_for(@comment) do|f| %>
<%= f.hidden_field :commentable_id, :value => @book.id %>
<%= f.hidden_field :commentable_type, :value => 'Book' %>
<%= f.label :comment %><br />
<%= f.text_area :comment %>
<%= f.submit "Post Comment" %>
<% end %>
控制器:
def create
@comment = Comment.create(params[:comment])
end
选项2)
在控制器中:
def create
@book = Book.find(params[:comment][:book_id])
@comment = @book.comments.create(params[:comment].except([:comment][:book_id]))
end
我没有测试过代码,但这个想法应该是正确的
更新,因为你想评论各种模型(我正在编写我的代码而不进行测试......)。所以,假设你有Book and Magazine,你想对它们发表评论。我想我会为它们定义嵌套路线。
map.resources :books, :has_many => :comments
map.resources :magazines, :has_many => :comments
然后在你的控制器中你可以做到:
before_filter :find_commentable
def find_commentable
@commentable = Book.find(params[:book_id]) if params[:book_id]
@commentable = Magazine.find(params[:magazine_id]) if params[:magazine_id]
end
在新观点中:
<% form_for :comment, [@commentable, @comment] do |f| %>
<%= f.label :comment %>
<%= f.text_area :comment %>
<%= f.submit %>
<% end %>
因此创建操作可能类似于:
def create
@user.comments.create(params[:comment].merge(:commentable_id => @commentable.id, :commentable_type => @commentable.class.name))
redirect_to @commentable
end
也许有更好的方法来做到这一点......