Я не понимаю, почему у идентификатора нет «id», это означает, что подчеркивание в конце id = «shipping_method_shipping_categories_» заставляет меня ожидать идентификатор для этой конкретной shipping_category.
Это поведение по умолчанию 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" />