【问题标题】:Rails Grouped Collection Select ValueRails 分组集合选择值
【发布时间】:2018-12-13 05:31:36
【问题描述】:

我有一个表格。 When a category is selected that does not have any subcategories, the default is 0 when ADDED by the database.但是当它被编辑时,如果不存在子类别,则值不会改变。

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

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

零件

配件

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

<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

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    既然你说如果子类别不存在,你有 coffescript 隐藏输入,但我不确定它是从 dom 中删除输入,还是只是用 css 隐藏它。

    选项 1:

    如果咖啡脚本正在将其从 dom 中删除,您可以添加隐藏输入:

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

    这种方式 Rails 在提交时将其拾取,如果您喜欢,您可以在 html vs 控制器中处理它。这仅在选择从 dom 中移除而不是隐藏时才有效。

    选项 2:

    如果咖啡脚本只是用 CSS 隐藏它,您可以将第一个/选定选项的默认值设置为 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
    

    【讨论】:

    • 它不会将它从 dom 中删除,它只是不会将任何选项添加到选择中,因为该类别没有任何选项。选项 2 不是我们想要的,因为它是动态生成的数据选择。以上是我的更新操作。我会把它放在控制器的哪里?我尝试了几种不同的方法,但它不起作用。请参阅上面的更新控制器。
    • 感谢您的快速回复!我尝试了变异,它不会更新product_category_id 的现有值,除非类别选择有子类别。然后我尝试了第二个选项,当我提交表单时,它现在给我一个表单错误,说产品子类别必须存在。
    • 似乎没有子类别时,它甚至看不到该字段。想法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    相关资源
    最近更新 更多