2010-09-21 6 views
3

Je travaille pour installer le plugin acts_as_commentable sur mon application Rails 3 .En cours d'installation acts_as_commentable, En cours de création, erreur: "attribut inconnu: book_id"

Après avoir ajouté "acts_as_commentable" à mon modèle de livre, je puis ajouté un formulaire de commentaire sur mon point de vue du spectacle du livre:

<% form_for(@comment) do|f| %> 
    <%= f.hidden_field :book_id %> 
    <%= f.label :comment %><br /> 
    <%= f.text_area :comment %> 
    <%= f.submit "Post Comment" %> 
<% end %> 

Ensuite, dans le contrôleur (comments_controller.rb),

def create 
    @comment = Comment.new(params[:comment]) 
    Book.comments.create(:title => "First comment.", :comment => "This 
is the first comment.") 
    end 

Ensuite, lors de la soumission d'un commentaire, il renvoie l'erreur: "inconnu attribut: livre_id" Dans le journal:

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' 

Suggestions?

Répondre

2

Je pense que vous avez des options:

Option 1) La vue:

<% 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 %> 

Le contrôleur:

def create 
    @comment = Comment.create(params[:comment]) 
end 

Option 2)

Dans le contrôleur:

def create 
    @book = Book.find(params[:comment][:book_id]) 
    @comment = @book.comments.create(params[:comment].except([:comment][:book_id])) 
end 

Je ne l'ai pas testé le code, mais l'idée doit être correcte

mise à jour, étant donné que vous voulez faire des commentaires sur les différents modèles (J'cris mon code sans le tester ...). Disons que vous avez Book and Magazine et que vous voulez les commenter. Je suppose que je définirais des routes imbriquées pour eux.

map.resources :books, :has_many => :comments 
map.resources :magazines, :has_many => :comments 

Et puis dans votre contrôleur que vous pourriez faire:

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 

Et dans la nouvelle vue:

<% form_for :comment, [@commentable, @comment] do |f| %> 
    <%= f.label :comment %> 
    <%= f.text_area :comment %> 
    <%= f.submit %> 
<% end %> 

Ainsi l'action create pourrait ressembler à:

def create 
    @user.comments.create(params[:comment].merge(:commentable_id => @commentable.id, :commentable_type => @commentable.class.name)) 
    redirect_to @commentable 
end 

Peut-être qu'il y a encore mieux o do it ...

+0

merci pour cela ... Est-ce la façon normale agit comme des œuvres commentables? Mon souci avec ceci est que je veux commenter sur différents modèles et le code ci-dessus est le client par modèle qui n'est pas SEC. Cela a-t-il du sens?Aussi pour obtenir le set user_id dans la table des commentaires, je l'ai mis à jour à "@comment = current_user.comments.create (params [: comment])" Y a-t-il un moyen de faire fonctionner ce commentaire pour les livres et pouvoir ensuite l'appliquer à n'importe quel modèle avec à peu près tout répéter ou personnaliser les champs cachés, etc.? – AnApprentice

+1

je vais modifier ma réponse – jordinl

+0

très agréable. Je vais essayer cela et rendre compte ce soir. Merci! – AnApprentice

3
<%= f.hidden_field :book_id %> 

Cela signifie que votre modèle Comment n'a pas de champ book_id. En outre, ce n'est pas une très bonne idée d'appeler un champ comme nom de modèle (commentaire). Utilisez body (ou message) au lieu de comment pour le champ qui doit contenir le corps du message.

+0

Merci mais je ne pense pas que ce soit une option avec le plugin Acts As Commentable pour Rails 3 – AnApprentice

Questions connexes