【问题标题】:Editing multiple nested records simultaneously in Rails在 Rails 中同时编辑多个嵌套记录
【发布时间】:2011-01-20 09:34:08
【问题描述】:

我正在创建一个简单的测验应用程序,其中一个问题可以有多个答案。为了提高我的应用的可用性,我希望用户能够以相同的形式编辑给定问题的所有答案:

我发现这个很棒的 Railscast/Asciicast 插曲几乎完全符合我的要求

http://asciicasts.com/episodes/198-edit-multiple-individually

但是,有一个问题。我的答案模型嵌套在这样的问题中:

  map.resources :answers, :has_one => :question

  map.resources :questions, :has_many => :answers

所以当需要定义路由和表单标签时,我有点不适应......本教程建议创建 2 个新的控制器方法并定义路由和表单标签,如下所示:

map.resources :products, :collection => { :edit_individual => :post, :update_individual => :put } 

<% form_tag edit_individual_products_path do %>  

但这在我的情况下不起作用,因为答案取决于问题......关于如何为我的嵌套模型翻译本教程的任何想法?

【问题讨论】:

    标签: ruby-on-rails nested routes


    【解决方案1】:

    从某些角度来看,使用嵌套路由看起来很漂亮,但总是变得有点棘手。为了让这个工作,你将不得不

    1. 修复路由定义
    2. 在所有视图中调整 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)

    我对@9​​87654321@ 视图进行了快速改编:

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

    享受您的嵌套路线!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多