2012-04-11 13 views
3

Ich erhalte immer eine undefined method 'comments' for nil:NilClass in meiner create-Methode, wenn ich versuche, einen neuen Kommentar (polymorphe Beziehung) zu erstellen. Ich habe einige andere Fragen dazu gelesen und kann nicht herausfinden, was mit meinem Formular/Controller falsch ist.find_commentable gibt undefinierte Methode `comments 'für nil zurück: NilClass

Hier ist mein generischer Teil für Bemerkungen:

<%= form_for [@commentable, Comment.new] do |f| %> 
    <%= f.text_area :content %> 
    <%= f.submit "Post" %> 
<% end %> 

Bitte beachten Sie, dass dies in meiner traveldeal/show Seite gerendert wird. Das Formular ist in Ordnung. Wenn ich die form_for ändern Parameter [@commentable, @comment] passieren, erhalte ich die Fehler undefined method model_name‘für NilClass: CLASS`

routes.rb

resources :users 
resources :traveldeals 

resources :traveldeals do 
    resources :comments 
end 

resources :users do 
    resources :comments 
end 

Die Railscasts hat die oben als resources :traveldeals, :has_many => :comments geschrieben, aber ich glaube, das ist datierte Syntax.

comments_controller.rb

class CommentsController < ApplicationController 
    before_filter :authenticate, :only => [:create, :destroy] 

    def new 
    @comment = Comment.new 
    end 

    def create 
    @commentable = find_commentable 
    @comment = @commentable.comments.build(params[:comment]) 
    @comment.user_id = current_user.id 

    if @comment.save 
     flash[:success] = "Successfully saved comment." 
     redirect_to root_path 
    else 
     redirect_to current_user 
    end 
    end 

private 

    def find_commentable 
    params.each do |name, value| 
     if name =~ /(.+)_id$/ 
     return $1.classify.constantize.find(value) 
     end 
    end 
    nil 
    end 

end 

Edit: Hinzugefügt wurde die Lösung so den obigen Code funktioniert für mich.

Antwort

1

Sie haben @commentable in Ihrem form_for, aber wo ist diese Variable gesetzt? Es scheint nirgends gesetzt zu sein und ich denke, das ist die Ursache des Fehlers. Siehe auch my answer bis your other question.

+0

Danke, dass Sie mich auf Ihre andere Antwort verwiesen haben, Mischa. Ich habe @commentable für die Seite definiert, auf der form_for angezeigt wird, aber jetzt werde ich an den fehlgeschlagenen Pfad (current_user) weitergeleitet, wenn ich das Formular absende, sodass mein Kommentar nicht gespeichert wird. – Huy

+1

Was meinen Sie mit "fehlgeschlagener Pfad (current_user)"? Es kann etwas mit dem 'before_filter' in Ihrem Kommentar-Controller zu tun haben ... sind Sie noch eingeloggt? – Mischa

+0

Ich meinte, dass mein Kommentar nicht gespeichert wird (so wie ich es in meinem Controller eingerichtet habe, werde ich zu current_user weitergeleitet, wenn es fehlschlägt). Ja, ich bin angemeldet, wenn ich versuche, den Kommentar zu erstellen. – Huy

Verwandte Themen