Работа в установках act_as_commentable, при создании, ошибка: «неизвестный атрибут: book_id» - PullRequest
3 голосов
/ 22 сентября 2010

Я работаю над тем, чтобы установить плагин act_as_commentable в моем приложении Rails 3.

После добавления "activ_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 ]

3 голосов
/ 22 сентября 2010
<%= f.hidden_field :book_id %> 

Это означает, что ваша модель Comment не имеет поля book_id.Кроме того, не очень хорошая идея называть поле именем модели (комментарий).Используйте body (или message) вместо comment для поля, которое должно содержать тело сообщения.

2 голосов
/ 22 сентября 2010

Я думаю, у вас есть варианты:

Вариант 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

Я не проверял код, но идея должна быть правильной

Обновление, если вы хотите прокомментировать различные модели (я пишу свой код, не тестируя его ...). Допустим, у вас есть Книга и Журнал, и вы хотите прокомментировать их. Думаю, я бы определил для них вложенные маршруты.

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

Может быть, есть еще лучшие способы сделать это ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...