我需要一些嵌套资源操作的帮助。我有三个嵌套资源:工作,问题和答案。我目前只是试图让编辑/更新方法适用于问题控制器。这种关系是这样的:乔布斯有很多问题和问题属于乔布斯。
我正在对问题使用编辑操作并收到错误:
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
答案 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 %>
执行此操作后,我的所有控制器方法都更清晰,编辑/更新操作正常。
这就是我解决问题的方法,可能不是最好的方法。此外,如果您有任何要添加的内容或有关我的代码的任何问题,请告诉我,我会看看我是否可以提供帮助。
谢谢!