我有一个表格。如果选择的类别没有任何子类别,则当数据库添加时默认为 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
答案 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