Rails分组收集选择值

时间:2018-12-13 05:31:37

标签: ruby-on-rails

我有一个表格。如果选择的类别没有任何子类别,则当数据库添加时默认为 0 。但是当它被编辑时,如果不存在子类别,则该值不会更改。

如果不存在子类别表单字段,我有一个咖啡脚本。

例如,我可能有两个类别:

零件

附件

零件类别可能有两个子类别,例如轮辋和轮胎。但是附件类别可能根本没有子类别。

<div class="form-group">
  <%= f.label "Category" %>
  <%= f.collection_select(:product_category_id, ProductCategory.all, :id, :name) %>
</div>
<div class="form-group">
  <%= f.label :product_subcategory_id, "Subcategory", class: "control-label" %>
  <%= f.grouped_collection_select(:product_subcategory_id, ProductCategory.order(:name), :product_subcategories, :name, :id, :name) %>
</div>

如果未选择任何子类别,我希望product_subcategory_id的值设置为 0

更新:prodcut_controller.rb

def update
  @product = Product.find(params[:id])

  if params.has_key?(:product_subcategory_id)
  else
    params[:product_subcategory_id] = 0
  end

  if @product.update_attributes(product_params)
    flash[:success] = "Updated successfully."
    redirect_to admin_products_path
  else
    render 'edit'
  end
end

1 个答案:

答案 0 :(得分:0)

由于您说过,如果子类别不存在,则您可以隐藏输入内容,但是我不确定是从dom中删除输入内容,还是仅使用CSS隐藏输入内容。

选项1:

如果将coffeescript从dom中删除,则可以添加隐藏的输入:

<%= form.hidden_field : product_subcategory_id, value: 0 %>

通过这种方式,Rails可以在提交时进行选择,如果您愿意的话,可以在html vs控制器中进行处理。仅当选择项从dom中删除而不是隐藏时,此选项才有效。

选项2:

如果coffeescript只是使用CSS隐藏,则可以将first / selected选项的默认值设置为0。

<%= form.select :product_subcategory_id, options_for_select([["", 0], "Foo", "Bar", "Buzz"]) %>

如果与选项2一起使用,则可能必须手动构建选项,而不是使用grouped_collection_select,以便可以添加默认为0的自定义默认选项。

选项3:

通过控制器方法/服务进行处理。

subcategory_id = params[:product_subcategory_id] ? params[:product_subcategory_id] : 0

我希望这对您有所帮助或给您一些想法!

编辑:

更改product_params可能是最简单的。

def update
  @product = Product.find(params[:id])
  product_params[:product_subcategory_id] = 0 unless product_params[:product_subcategory_id]
  if @product.update_attributes(product_params)
    flash[:success] = "Updated successfully."
    redirect_to admin_products_path
  else
    render 'edit'
  end
end

如果您不想突变,可以:

def update
  @product = Product.find(params[:id])
  # Similiar to .new, but for updating.
  @product.assign_attributes(product_params)
  # Override the existing subcategory if product_params[:product_subcategory_id] is falsey
  @product.product_subcategory_id = 0 unless product_params[:product_subcategory_id]
  # Save
  if @product.save
    flash[:success] = "Updated successfully."
    redirect_to admin_products_path
  else
    render 'edit'
  end
end

或者如果您在Rails 5+上,则可以使用属性api设置默认值。

class Product < ApplicationRecord
  attribute :product_subcategory_id, :integer, default: 0
end