0

我需要一些有关嵌套资源操作的帮助。我有三个嵌套资源:作业、问题和答案。我目前只是试图让编辑/更新方法适用于问题控制器。关系是这样的:Jobs has_many questions 和 Questions 属于 Jobs。

我正在对问题使用编辑操作,但出现错误:

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

我不明白的事情是:a)为什么它会将我重定向到问题索引路径,当我没有将它重定向到那里时,b)它说这不是一个有效的路线,但如果我刷新那个确切页面正确加载的 URL。

我尝试了多种选择,但我无法找出解决方案。

谢谢您的帮助。如果您需要更多信息,请告诉我。

ps 这是我的 rake 路线:https ://gist.github.com/1077134

4

2 回答 2

2

所以事实证明,我的问题比我最初想象的要复杂一些。我的数据库和表设置不正确,他们无法为我的资源找到正确的 :ids。我必须首先像这样规范化我的表格:

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

并在我的作业(父资源)new_form 视图中创建了带有循环的nested_forms。

<%= 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 %>

完成此操作后,我的所有控制器方法都更干净了,并且编辑/更新操作正常工作。

这就是我解决问题的方法,它可能不是最好的方法。另外,如果您有任何要添加的内容或对我的代码有任何疑问,请告诉我,我会看看是否可以提供帮助。

谢谢!

于 2011-07-20T03:14:45.030 回答
2

为了让你开始,在 view/jobs/show.rb :

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

在 view/questions/show.rb 中:

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

在 view/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
于 2011-07-18T09:12:19.940 回答