Rails:Form fields&循环

时间:2015-12-14 08:16:24

标签: ruby-on-rails

我正在使用Dependent-Fields gem。它基本上是JavaScript,它会对" js-dependent-fields"做出反应。类。以下代码按预期工作:

<div class="panel-body">
 <div class="form-group">
  <%= f.label :brand %>
  <%= f.select(:brand, Brand.pluck(:company).uniq, {prompt:true}, {class: 'form-control'}) %>
 </div>
 <% Brand.all.each do |b| %>
  <div class="form-group js-dependent-fields" data-option-value="<%= b.company %>" data-select-id="warehouse_brand">
    <%= f.label :category %>
    <%= f.collection_select(:category, Group.where(brand: b.company), :brand, :name1, {prompt:true}, {class: 'form-control'}) %>
  </div>
<% end %>

问题是循环使用style="display:none;"创建了适当数量的div(每个)。但是当我想保存表单时,Rails会感到困惑,因为有多个&#34;类别&#34;表格领域。结果是:&#34;类别&#34;中没有任何内容被保存。记录。 HTML输出:

<div class="form-group">
  <label for="warehouse_brand">Brand</label>
  <select class="form-control" name="warehouse[brand]" id="warehouse_brand">
    <option selected="selected" value="Adidas">Adidas</option>
    <option value="Nike">Nike</option>
    <option value="Fila">Fila</option>
</div>
<div class="form-group js-dependent-fields" data-option-value="Adidas" data-select-id="warehouse_brand" style="">
  <label for="warehouse_category">Category</label>
  <select class="form-control" name="warehouse[category]" id="warehouse_category">
    <option value="">Please select</option>
    <option value="Adidas">Shoes</option>
    <option value="Adidas">Shirts</option>
  </select>
</div>
<div class="form-group js-dependent-fields" data-option-value="Nike" data-select-id="warehouse_brand" style="display: none;">
  <label for="warehouse_category">Category</label>
  <select class="form-control" name="warehouse[category]" id="warehouse_category">
    <option value="">Please select</option>
  </select>
</div>
<div class="form-group js-dependent-fields" data-option-value="Fila" data-select-id="warehouse_brand" style="display: none;">
  <label for="warehouse_category">Category</label>
  <select class="form-control" name="warehouse[category]" id="warehouse_category">
    <option value="">Please select</option>
  </select>
</div>

我猜Rails不知道由于循环而必须保存哪个表单字段(遗憾的是必须这样)。你有解决方案吗?

3 个答案:

答案 0 :(得分:3)

禁止使用表单提交字段。您必须禁用字段。 e.g。

$("input").prop('disabled', true);

它将禁用这些字段,并且这些字段不会随表单一起提交。 为了启用字段,请使用此

$("input").prop('disabled', false);

在你的情况下,你应该试试这个。

$( "#submit_form" ).click(function() {
  $('.js-dependent-fields:hidden').prop('disabled', true);
});

您的代码将有效。只有在上面的代码中提供了正确的选择器。或者您可以通过

清空内容
$('.js-dependent-fields:hidden').html('');

答案 1 :(得分:2)

Rails有一个用于处理嵌套表单的内置机制。

让我们说:

class Company < ActiveRecord::Base
  has_many :brands
  accepts_nested_attributes_for :brands
end

class Brand < ActiveRecord::Base
  belongs_to :company
end

class CompaniesController < ApplicationController
  def new
    @company = Company.new
    @company.brands.new # seeds the form with a new record for brands
  end

  def edit
    @company = Company.find(params[:id])
    @company.brands.new # seeds the form with a new record for brands
  end
end

自公司accepts_nested_attributes_for :brands以来,我们可以通过params[:company][:brands_attributes]同时创建公司和品牌。幸运的是,我们不必手动执行此操作。

<%= form_for(@company) do |f| %>
  <div class="field">
    <%= f.label :name %>
    <%= f.text_field :name %>
  </div>
  <fieldset>
    <legend>Brands</legend>
    <%= f.fields_for(:brands) do |brand_fields| %>
      <%= brand_fields.label :foo %>
      <%= brand_fields.text_field :foo %>
    <% end %>
  </fieldset>
<% end %>

这将使用名称属性的数组格式:

<input name="company[brands_attributes][0][foo]" #...

答案 2 :(得分:0)

Dependent-Fields gem仅将未选择的字段设置为隐藏。它将以下css样式添加到字段

// ...

trace ("Times up");
secTimer.stop();

gotoAndPlay(525); 

// ...

即使显示设置为&#39;无,也会提交字段。在现代浏览器中。我认为以下代码可以解决问题。

 style="display: none;"

此代码有助于将正确的参数发送到操作。