Rails 3嵌套资源编辑/更新方法 - 路由错误

时间:2011-07-12 00:49:33

标签: ruby-on-rails nested-resources nested-routes nomethoderror

我需要一些嵌套资源操作的帮助。我有三个嵌套资源:工作,问题和答案。我目前只是试图让编辑/更新方法适用于问题控制器。这种关系是这样的:乔布斯有很多问题和问题属于乔布斯。

我正在对问题使用编辑操作并收到错误:

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页面正确加载。

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

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

P.S。这是我的佣金路线:https://gist.github.com/1077134

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

事实证明,我的问题比我原先想象的要多一些。我的数据库和表格没有正确设置,他们无法找到合适的:我的资源ID。我必须从这样规范化我的表开始:

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

执行此操作后,我的所有控制器方法都更清晰,编辑/更新操作正常。

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

谢谢!