2011-07-01 4 views
1

J'ai une idée de ce qui ne va pas, mais j'ai du mal à le réparer.Imbrication des ressources 3 Niveaux profonds

Pour expliquer à nouveau ma situation, j'ai 3 éléments: Travaux, Questions et Réponses. Toutes les relations sont définies ci-dessous. En développant ma question précédente qui concernait la relation Emploi/Questions, j'ai maintenant ajouté la relation Réponses dans Emplois> Questions> Réponses. Donc, avec une nouvelle ressource dans mes routes.rb, je recevais des erreurs de routage, que je réparais au fur et à mesure. Le problème est survenu lorsque je suis arrivé au formulaire Réponses # nouvelle page et que j'ai dû modifier le formulaire_for échafaudage et construire sur l'action Créer dans le contrôleur Réponses (vous pouvez voir mon code pour les deux ci-dessous).

j'ai pu corriger assez ceux pour montrer la forme sur la nouvelle page de réponses, mais quand je clique sur soumettre Je reçois cette erreur:

No route matches {:action=>"show", :controller=>"answers", :job_id=>nil, :question_id=>1, :id=>#<Answer id: 3, job_id: nil, question_id: 1, answer1: "", answer2: "", answer3: "", answer4: "", answer5: "", created_at: "2011-07-01 03:12:06", updated_at: "2011-07-01 03:12:06">} 

De cette erreur, je vois que je ne suis pas gardais le job_id et je suis assez sûr que cela a à voir avec moi ne pas appeler le job_id correctement soit dans mes réponses créent une action ou répond à nouveau form_for code. J'ai essayé une tonne de solutions, mais rien ne semble fonctionner. J'ai l'impression d'être proche de mon action de création, mais je n'arrive pas à le faire correctement. Quoi qu'il en soit, merci d'avance pour toute aide et si je ne vous ai pas fourni assez de code environnant, faites le moi savoir et je vais l'ajouter.

Cette question est un extenstion de ce post: Link_to Routing Issue With Nested Resources

post-scriptum J'ai également ajouté mes réponses montrent l'action, parce que bien qu'il fonctionne correctement si je vais directement aux réponses/1 /. J'ai juste le sentiment que si mon action de création est mauvaise, mon action de show aussi.

Modèles:

class Job < ActiveRecord::Base 
has_many :questions 
has_many :answers 

class Question < ActiveRecord::Base 
belongs_to :job 
has_many :answers 

class Answer < ActiveRecord::Base 
belongs_to :job 
belongs_to :question 

Réponses # nouveau formulaire

<%= form_for(@answer, :url => job_question_answers_path(@answer.job_id, @question)) do |f| %> 

Réponses créer une action

def create 
@job = Job.find(params[:job_id]) 
@question = @job.questions.find(params[:question_id]) 
@answer = @question.answers.build(params[:answer]) 
if @answer.save 
redirect_to(job_question_answer_path(@answer.job_id, @answer.question_id, @answer) 
end 
end 

Les réponses montrent une action

def show 
@job = Job.find(params[:job_id]) 
@question = @job.questions.find(params[:question_id]) 
@answer = @question.answers.find(params[:id]) 
end 

Voir ce https://gist.github.com/1057810 pour mes itinéraires rake les plus courants. Je sais que je ne devrais pas nicher plus d'une couche de profondeur, mais c'était la solution la plus simple et la plus rapide pour moi.

Merci encore!

Répondre

0

Sur la base de cette ligne:

No route matches { 
    :action=>"show", :controller=>"answers", 
    :job_id=>nil, #Problem 
    :question_id=>1, 
    :id=>#<Answer id: 3, job_id: nil, question_id: 1, answer1: "", answer2: "", answer3: "", answer4: "", answer5: "", created_at: "2011-07-01 03:12:06", updated_at: "2011-07-01 03:12:06">} 

Vous pouvez voir que le job_id dans votre objet réponse est nulle. Votre formulaire aide utilise job_question_answers_path qui nécessite une job_id et un question_id, mais l'erreur de route est brisée parce que le job_id est nul (@answer.job_id):

<%= form_for(@answer, :url => job_question_answers_path(@answer.job_id, @question)) do |f| %> 

Essayez de régler @answer.job dans votre explicitement l'action AnswersController#new.

def new 
    # You may already have code that does this... 
    @answer = Answer.new 

    # Guessing on param names here: 
    @answer.question = Question.find params[:question_id] 
    @answer.job = Job.find params[:job_id] 

    # Alternatively, you can probably just set the ids, 
    # but the above will verify those objects exist first. 
    @answer.job_id = params[:job_id] 
    @answer.question_id = params[:question_id] 
end 
+0

Salut Brett, merci pour l'aide et d'expliquer tout cela. Malheureusement, j'ai ajouté ce code à mes réponses nouvelle action et il ne sauve pas encore le job_id par la même erreur- "Aucune route correspond {: action =>" show ",: controller =>" réponses ",: job_id => nil,: question_id => 1,: id => # } '. Cela signifie-t-il qu'il doit s'agir d'une création? répond à un problème? Voici une pastie du serveur- http://www.pastie.org/2169613 – Igrabes

Questions connexes