【问题标题】:How do I nest models using a form_tag in Rails 4?如何在 Rails 4 中使用 form_tag 嵌套模型?
【发布时间】:2016-03-26 08:30:41
【问题描述】:

我有一个表格可以将 SaleQualifiers 添加到我的应用程序中 - 在我使用时效果很好:

<%= form_for(@sale_qualifier, :html => {role: :form, 'data-model' => 'sale_qualifier'}, remote: true) do |f| %>

form_for 的问题是我想将表单内联放在我视图中的表格行中 - 作为一种解决方法,我现在正在使用:

<%= form_tag('/sale_qualifiers', method: :post, remote: true) do -%> <%= fields_for :sale_qualifier do |ff| %>

这对于我需要生成的大多数字段都可以正常工作,但我有一个嵌套属性字段用于 Answer (Answer belongs_to SaleQualifier)。这不会在视图中生成正确的字段名称,因此当我以这种方式保存对象时,我不会捕获 answer_attributes。

这是使用 form_for 的完整工作表单:

<div class="panel panel-default">
 <%= form_for(@sale_qualifier, :html => {role: :form, 'data-model' => 'sale_qualifier'}, remote: true) do |f| %>
  <% if @sale_qualifier.errors.any? %>
  <div id="error_explanation">
    <h2><%= pluralize(@sale_qualifier.errors.count, "error") %> prohibited this answer from being saved:</h2>
    <ul>
    <% @sale_qualifier.errors.full_messages.each do |message| %>
      <li><%= message %></li>
    <% end %>
    </ul>
  </div>
<% end %>
<div class="panel-body">
  <div class="col-sm-6">
    <h2><%= @question.question_text %></h2>
    <% unless @question.id == 1 %>
      <p><%= link_to('Back', edit_sale_qualifier_path(id: @prior_sale_qualifier), data: { disable_with: "Loading..." }, :remote => true) %></p>
    <% end %>
  </div>
  <div class="col-sm-6">
    <div class="form-group">
      <%= f.hidden_field :sales_opportunity_id, :value => @sales_opportunity.id %>
    </div>
    <div class="form-group">
      <%= f.hidden_field :question_id, :value => @question.id %>
    </div>
    <% unless @question.id == 1 %>
      <div class="form-group">
        <%= f.hidden_field :prior_question_id, :value => @prior_question_id %>
      </div>
    <% end %>
    <%= f.fields_for :answer do |answer| %>
    <div class="form-group">
      <% if @question.answer_type == 'Text Field' %>
        <%= answer.text_area :answer_text, :placeholder => "Enter your answer", :class => "form-control"%>
      <% end %>
      <% if @question.answer_type == 'Datetime' %>
        <div class='input-group date' id='datetimepicker' data-date-format="YY.MM.DD">
          <%= answer.text_field :answer_text, class: "form-control", data: { date_format: 'YYYY/MM/DD' }, :placeholder => "YYYY/MM/DD" %>
          <span class="input-group-addon">
            <span class="glyphicon glyphicon-calendar"></span>
           </span>
        </div>
      <% end %>
      <% if @question.answer_type == 'Boolean' %>
        <%= answer.select :answer_text, [['Yes', true], ['No', false]] %>
      <% end %>
      <% if @question.answer_type == 'Update' || @question.answer_type == 'Result' %>
        <%= answer.hidden_field :answer_text, :value => "Updated" %>
      <% end %>
      <span class="warning-block"></span>
      <span class="help-block"></span>
    </div>
    <% end %>
      <% if @question.answer_type == 'Update' || @question.answer_type == 'Result' %>
        <div class="actions">
          <%= f.submit "Done", class: "btn btn-large btn-success", data: { disable_with: "Submitting..." }, autocomplete: 'off' %>
        </div>
      <% else %>
        <div class="actions">
          <%= f.submit "Submit", class: "btn btn-large btn-success", data: { disable_with: "Submitting..." }, autocomplete: 'off' %>
        </div>
      <% end %>
    <% end %>
  </div>
 </div>
</div>

这是使用 form_tag 不起作用的代码:

<%= form_tag('/sale_qualifiers', method: :post, remote: true) do -%>
 <%= fields_for :sale_qualifier do |ff| %>
  <%= ff.hidden_field :sales_opportunity_id, :value => @sales_opportunity.id %>
  <%= ff.hidden_field :question_id, :value => @question.id %>
   <tr>
    <td><%= @question.question_text %></td>
    <td>
        <%= ff.fields_for :answer do |answer| %>
        <% if @question.answer_type == 'Text Field' %>
          <%= answer.text_area :answer_text%>
        <% end %>
        <% if @question.answer_type == 'Datetime' %>
            <div class='input-group date' id='datetimepicker' data-date-format="YY.MM.DD">
            <%= answer.text_field :answer_text, class: "form-control", data: { date_format: 'YYYY/MM/DD' }, :placeholder => "YYYY/MM/DD" %>
            <span class="input-group-addon">
             <span class="glyphicon glyphicon-calendar"></span>
            </span>
             </div>
        <% end %>
        <% if @question.answer_type == 'Boolean' %>
          <%= answer.select :answer_text, [['Yes', true], ['No', false]] %>
        <% end %>
        <% end %>
        </td>
        <td>
            <%= ff.submit "Submit", class: "btn btn-large btn-success", data: { disable_with: "Submitting..." }, autocomplete: 'off' %>
        </td>
    </tr>
<% end %>     
<% end %>  

为了完整起见,我遇到的问题是为工作代码生成的 html 创建了以下字段:

textarea id="sale_qualifier_answer_attributes_answer_text" name="sale_qualifier[answer_attributes][answer_text]"

损坏的代码创建以下 html:

Textarea id="sale_qualifier_answer_answer_text" name="sale_qualifier[answer][answer_text]"

那么在这种情况下,如何使用 form_tag 让 html 输出显示“sale_qualifier[answer_attributes][answer_text]”而不是“sale_qualifier[answer][answer_text]”?

【问题讨论】:

  • 试试 'ff.fields_for :answer_attributes do |answer|'
  • @mgidea - 谢谢,效果很好。如果您想将其添加为答案,那么我会接受。

标签: html ruby-on-rails


【解决方案1】:

在多个嵌套表单中,fields_for 标签将被调用 否则应遵循正确的父级和属性约定 它使表单属性错误并导致错误。

<%= form_tag('/sale_qualifiers', method: :post, remote: true) do -%>
 <%= fields_for :sale_qualifier do |ff| %>   
   <%= ff.fields_for :answer_attributes do |answer| %>

上面的流程将是正确的,并将生成应有的属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多