Вложенные ресурсы 3 уровня глубоко - PullRequest
1 голос
/ 01 июля 2011

У меня есть представление о том, что идет не так, но я не могу исправить это.

Чтобы объяснить мою ситуацию еще раз, у меня есть 3 элемента: задания, вопросы и ответы. Все отношения установлены ниже. Расширяя свой предыдущий вопрос, который был связан с отношением «Работа»> «Вопросы», теперь я добавил отношение «Ответы» в «Работа»> «Вопросы»> «Ответы».

Итак, с новым ресурсом в моем route.rb я получал ошибки маршрутизации, которые я исправлял по ходу дела. Проблема возникла, когда я добрался до формы Ответы # новая страница и мне пришлось изменить форму form_for scaffolding и собрать действие Создать в контроллере ответов (вы можете увидеть мой код для этих двух ниже).

Мне удалось исправить это достаточно, чтобы показать форму на странице новых ответов, но когда я нажимаю кнопку Отправить, я получаю эту ошибку:

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">}

Из этой ошибки я вижу, что я не сохраняю job_id, и я почти уверен, что это связано со мной, когда я не вызываю job_id должным образом ни в моих действиях по созданию ответов, ни в ответах на новый код form_for. Я перепробовал кучу решений, но, похоже, ничего не работает. Я чувствую, что я близок к своему действию создания, но не могу понять это правильно. В любом случае, заранее спасибо за любую помощь, и если я не предоставил вам достаточно окружающего кода, дайте мне знать, и я добавлю его.

Этот вопрос является продолжением этого поста: Ссылка на проблему маршрутизации со вложенными ресурсами

P.S. Я также добавил, что мои ответы показывают действие, потому что, хотя оно работает правильно, если я перейду к ответам / 1 / напрямую. У меня просто такое ощущение, что если мое творческое действие неверно, то и мое шоу-действие тоже.

Модель:

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

Ответы # новая форма

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

Ответы создать действие

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

Ответы показывают действие

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

См. https://gist.github.com/1057810 для моих самых последних рейк-маршрутов. Я знаю, что я не должен вкладывать более 1 слоя в глубину, но это было самое простое и быстрое решение для меня.

Еще раз спасибо!

1 Ответ

0 голосов
/ 01 июля 2011

На основе этой строки:

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">}

Вы можете видеть, что job_id в вашем объекте ответа - ноль. Ваш помощник по формам использует job_question_answers_path, для которого требуются job_id и question_id, но ошибка маршрута нарушена, поскольку job_id равен nil (@answer.job_id):

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

Попробуйте установить @answer.job в своем действии 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
...