Метод редактирования / обновления вложенных ресурсов Rails 3 - ошибка маршрутизации - PullRequest
0 голосов
/ 12 июля 2011

Мне нужна помощь с вложенными действиями с ресурсами.У меня есть три вложенных ресурса: вакансии, вопросы и ответы.В настоящее время я только пытаюсь заставить метод edit / update работать для контроллера вопросов.Отношения таковы: вопросы о Джобсе has_many и Вопросы принадлежат Джобсу.

Я использую действие редактирования для вопросов и получаю сообщение об ошибке:

No route matches "/jobs/1/questions"

и не могу понять, почему.

В настоящее время этот код используется в качестве действия по редактированию и обновлению моего контроллера вопросов:

def edit
 @job = Job.find(params[:job_id])
 @question = @job.questions.find(params[:id])
end

def update
  @job = Job.find(params[:job_id])
  @question = @job.questions.find(params[:id])

  if @question.update_attributes(params[:question])
    redirect_to(@question)
  end
end

Модели:

class Job < ActiveRecord::Base
has_many :questions

class Question < ActiveRecord::Base
belongs_to :job

Маршруты:

  resources :jobs do
   resources :questions do
    resources :answers
   end
 end

То, чего я не понимаю, это: а) почему он перенаправляет меня на путь индекса вопросов, когда я не перенаправил его туда, и б) он говорит, что это недопустимый маршрут, но если яобновите этот точный URL-адрес, страница загружается правильно.

Я пробовал несколько вариантов, но не могу найти решение.

Спасибо за помощь.Дайте мне знать, если вам нужна дополнительная информация.

ps вот мои рейк-маршруты: https://gist.github.com/1077134

Ответы [ 2 ]

2 голосов
/ 20 июля 2011

Так что получается, что моя проблема была немного более сложной, чем я первоначально думал.Моя база данных и таблицы не были настроены должным образом, и у них были проблемы с поиском подходящих идентификаторов для моих ресурсов.Я должен был начать с нормализации моих таблиц следующим образом:

class CreateQuestions < ActiveRecord::Migration
def self.up
create_table :questions do |t|
   t.references :job
  t.text :question1
  t.text :question2
  t.text :question3
  t.text :question4
  t.text :question5
  t.text :question6
  t.text :question7
  t.text :question8
  t.text :question9
  t.text :question10

  t.timestamps
end
end

Эта установка была повторяющейся и грязной, и она путала действия контроллера.Поэтому я изменил его на:

def self.up
create_table :questions do |t|
  t.references :job
  t.text :question

  t.timestamps
end
end

и создал nested_forms с циклами в моих заданиях (родительский ресурс) new_form view.

<%= form_for(@job) do |f| %>
 <%= f.label :name %><br />
 <%= f.text_field :name %>
<%= f.fields_for :questions do |builder| %>
 <%= f.label :question, "Question" %><br \>
 <%= f.text_area :question, :rows => 10 %>
<% end %>

После этого все мои методы контроллера были чище, и действие редактирования / обновления работало правильно.

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

Спасибо!

2 голосов
/ 18 июля 2011

Для начала, В представлении / jobs / show.rb:

<%= link_to 'Edit', edit_jobs_path(@job) %>

На виду / вопросы / show.rb:

<%= link_to 'Edit', edit_job_question_path(@question.job, @question) %>

В представлении / questions / edit.rb:

<%= link_to 'Show', job_question_path %>

Я показываю, что ссылки должны иметь вложенный шаблон. Если ваши ответы содержат много комментариев, вы можете получить такие вещи, как: edit_job_question_answer_comment (@job, @question, @answer, @comment) где переменные @symboled выводятся в контроллере. Надеюсь, это поможет!

Позже вы можете захотеть:

class Job < ActiveRecord::Base
  has_many :questions
  has_many :answer, :through => :questions

  # If you want to edit the questions of a job whilst editing a job then research accepts nested attributes
  #accepts_nested_attributes_for :questions, :allow_destroy => true
end
...