从某些角度来看,使用嵌套路由看起来很漂亮,但总是变得有点棘手。为了让这个工作,你将不得不
- 修复路由定义
- 在所有视图中调整 URL 生成器(如 form_for 或 answers_path)
路线
首先要做的事情:在路由中指定关联将不允许您将自定义路由添加到第二个类。我会这样做:
map.resources :questions do |question|
question.resources :answers, :collection => {
:edit_individual => :post,
:update_individual => :put }
end
观看次数
注意 URL 生成器的变化非常重要:
- edit_answer_path(@answer) => edit_question_answer_path(@question, @answer)
- edit_individual_answer_path(@answer) => edit_individual_question_answer_path(@question, @answer)
我对@987654321@ 视图进行了快速改编:
<!-- views/answers/index.html.erb -->
<% form_tag edit_individual_question_answer_path(@question) do %>
<table>
<tr>
<th></th>
<th>Name</th>
<th>Value</th>
</tr>
<% for answer in @answers %>
<tr>
<td><%= check_box_tag "answer_id_ids[]", answer.id %></td>
<td><%=h answer.name %></td>
<td><%=h answer.value %></td>
<td><%= link_to "Edit", edit_question_answer_path(@question, answer) %></td>
<td><%= link_to "Destroy", question_answer_path(@question, answer), :confirm => 'Are you sure?', :method => :delete %></td>
</tr>
<% end %>
</table>
<p>
<%= select_tag :field, options_for_select([["All Fields", ""], ["Name", "name"], ["Value", "value"]]) %>
<%= submit_tag "Edit Checked" %>
</p>
<% end %>
<!-- views/answers/edit_individual.html.erb -->
<% form_tag update_individual_question_answers_path, :method => :put do %>
<% for answer in @answers %>
<% fields_for "answers[]", answer do |f| %>
<h2><%=h answer.name %></h2>
<%= render "fields", :f => f %>
<% end %>
<% end %>
<p><%= submit_tag "Submit" %></p>
<% end %>
额外
您可能已经看到,您需要在视图中使用变量 @question,因此我建议您在 AnswersController 中使用 before_filter 来获取问题对象:
AnswersController
before_filer :get_question
[...]
private
def get_question
# @question will be required by all views
@question = Question.find(params[:question_id])
end
end
享受您的嵌套路线!