使用安装acts_as_commentable,On create,error:“unknown attribute:book_id”

时间:2010-09-21 20:44:47

标签: ruby-on-rails ruby-on-rails-3

我正在努力在我的上安装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' 

建议?

2 个答案:

答案 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

也许有更好的方法来做到这一点......