2011-01-25 2 views
1
class CommentsController < ApplicationController 

    def create 

    @commentable= context_object() 
    @comment = @commentable.comments.build(params[:comment].merge(:user_id => current_user.id)) 

    if @comment.save 
     respond_to do |format| 
     format.js 
     end 
    else 
     render :action => 'new' 
    end 
    end 

    private 

    def context_object 
    params[:constraint][:context_type].singularize.classify.constantize.find(context_id) 
    end 

    def context_id 
    params["#{ params[:constraint][:context_type].singularize }_id"] 
    end 

end 

Ce module de commentaires m'a bien servi, mais j'ai rencontré un problème ce matin, peut-être à cause de mon utilisation de ressources imbriquées. Essentiellement, j'ai maintenant une URL comme:Rails 3 - Aider avec un module de commentaire

/projects/3/albums/6/attachments/84 

Quand je commente sur cette page, je reçois l'erreur:

ActiveRecord::RecordNotFound (Couldn't find Project without an ID): 
    app/controllers/comments_controller.rb:102:in `context_object' 
    app/controllers/comments_controller.rb:14:in `create' 

Mon fichier itinéraires ressemble:

resources :projects do 
    resources : albums do 
    resources :attachments 
    end 
end 

resources :attachments do 
    resources :comments, :only => [:create, :update,:destroy], 
       :constraint => {:context_type => "conversations"} 
end 

Toutes les idées sur comment je peux obtenir le module de commentaire pour bien jouer avec des commentaires sur project>Album>Attachment?

Merci pour l'entrée,

+1

J'ai modifié votre article pour la lisibilité du code. Pourriez-vous clarifier pourquoi les commentaires sur les ressources sont-ils imbriqués sur les pièces jointes en dehors des projets> hiérarchie des albums? Avez-vous besoin de GET/pièces jointes et de commenter? Avez-vous essayé de fournir des commentaires sur les pièces jointes des projets> albums> pièces jointes? – tomeduarte

+0

@tomeduarte merci! c'est un bon point. Donc je vais m'en débarrasser. Je suppose que cela aurait plus de sens pour les commentaires de ressource dans la ressource imbriquée (je suis encore nouveau sur les rails) ... J'ai essayé mais j'ai une erreur: "ActionView :: Template :: Error (méthode non définie' attachment_comments_path 'pour # <# : 0x103018610>): "Je vais mettre à jour ma question ci-dessus avec le nouveau chemin de ressource. que faites-vous? – AnApprentice

+0

ok Le débordement de pile ne me laissera pas éditer, c'est une douleur. Ici, il est collé (eck) ressources: groupes font ressources: albums font ressources: commentaires,: only => [: créer,: mise à jour,: détruire],: contrainte => {: context_type => "albums"} ressources: pièces jointes faire ressources: commentaires,: only => [: créer,: mise à jour,: détruire],: contrainte => {: context_type => "pièces jointes"} fin fin fin – AnApprentice

Répondre

0

ce détachement comme une réponse afin de ne pas encombrer les commentaires à la question initiale.

Puisque vous n'avez pas l'obligation de conserver les pièces jointes disponibles via /attachments - faire les deuxièmes ressources bloc inutile, faire quelque chose comme ceci:

resources :projects do 
    resources :albums do 
    resources :attachments do 
     resources :comments, :only => [:create, :update,:destroy], 
          :constraint => {:context_type => "conversations"} 
    end 
    end 
end 

Cela va changer vos aides itinéraires (de _PATH et _url) , passez en revue votre contrôleur (s) et affichage (s) et changez-les pour refléter vos nouveaux assistants. De manière spécifique, attachment_comments_path devient project_album_attachment_comments_path.

La liste complète des routes pour ces modèles peut être affichée en exécutant rake routes dans une console. Je vous recommande également de regarder de plus près le Rails routing guide.

Questions connexes