首页 > 解决方案 > Check_box_tag 输入标识

问题描述

我有一个看起来像这样的 check_box_tag:

check_box_tag('shipping_method[shipping_categories][]', category.id, 
@shipping_method.shipping_categories.include?(category))

在浏览器中检查输出时,我有以下内容:

<input id="shipping_method_shipping_categories_" 
name="shipping_method[shipping_categories][]" type="checkbox" value="1" />

我不明白为什么 id 没有“id”,这意味着末尾的下划线

id="shipping_method_shipping_categories_"

让我期待这个特定 shipping_category 的 id。

你们中的任何人都对此有想法吗?

谢谢 !

标签: htmlruby-on-railscheckboxcollections

解决方案


我不明白为什么 id 没有“id”,这意味着 id="shipping_method_shipping_categories_" 末尾的下划线让我期待这个特定 shipping_category 的 id。

这是check_box_tag. 换句话说,它是这样构造的。当您查看它的构造代码时,您将看到以下内容

# File actionview/lib/action_view/helpers/form_tag_helper.rb, line 374
def check_box_tag(name, value = "1", checked = false, options = {})
  html_options = { "type" => "checkbox", "name" => name, "id" => sanitize_to_id(name), "value" => value }.update(options.stringify_keys)
  html_options["checked"] = "checked" if checked
  tag :input, html_options
end

所以,"id"是用 方法构造的sanitize_to_id(name)。所以我进一步sanitize_to_id(name)查看了它的代码,我发现了这个

def sanitize_to_id(name)
  name.to_s.delete("]").tr("^-a-zA-Z0-9:.", "_")
end

所以,shipping_method[shipping_categories][].to_s.delete("]").tr("^-a-zA-Z0-9:.", "_")返回shipping_method_shipping_categories_。这解释了它的行为。

如果你想达到你所期望的,我建议你去collection_check_boxes

例如,

collection_check_boxes(:post, :author_ids, Author.all, :id, :name_with_initial)

返回

<input id="post_author_ids_1" name="post[author_ids][]" type="checkbox" value="1" checked="checked" />

推荐阅读