无法设置 Rails 自定义表单帮助器方法

Trouble setting up Rails custom form helper method

我正在尝试创建自定义表单帮助器方法(用于自定义 HTML 复选框标记),但我遇到了一些问题。我创建了以下助手,wrapped_check_box

module FormHelper
  class ActionView::Helpers::FormBuilder
    include ActionView::Helpers::FormTagHelper
    include ActionView::Helpers::FormOptionsHelper

    def wrapped_check_box(name, options = {})
      raw "<div class='checkbox-wrapper'>" + \
        check_box_tag(@object_name, name, options) + \
        "<span class='checkbox-check'></span>" + \
      "</div>"
    end
  end
end

用法示例:

<%= f.wrapped_check_box :receives_updates %>

当我使用它时,在这个示例中,来自一个新的 User 模型,我得到以下输出:

<div class="checkbox-wrapper">
  <input type="checkbox" name="user" id="user" value="receives_updates" checked="checked">
  <span class="checkbox-check"></span>
</div>

这里有两个问题:

  1. 该字段是自动检查的,即使我传入 checked: false
  2. 这似乎是不正确的 id 值,它与 <label> 标签以及一般情况下的所有内容混淆了

我一直在关注各种文章以将其拼凑在一起,但显然我做错了什么。感谢您的帮助:)

更新

我通过更新 check_box_tag 方法取得了一些进展:

check_box_tag("#{@object_name}[#{name.to_s}]", 1, options)

现在输出:

<input type="checkbox" name="user[receives_updates]" id="user_receives_updates" value="1" checked="checked">

这正是我想要的,但不幸的是它仍然总是输出 checked="checked",即使我将它作为 false 传递。

有什么想法吗?

我回头看了 check_box_tag 的文档,对它有了更多的了解。我最终选择了这个:

module FormHelper
  def wrapped_check_box_tag(name, value=1, checked=false, options={})
    raw "<div class='checkbox-wrapper'>" + \
      check_box_tag(name, value, checked, options) + \
      "<span class='checkbox-checks'></span>" + \
    "</div>"
  end

  class ActionView::Helpers::FormBuilder
    include FormHelper
    include ActionView::Helpers::FormTagHelper
    include ActionView::Helpers::FormOptionsHelper

    def wrapped_check_box(name, options = {})
      wrapped_check_box_tag("#{@object_name}[#{name.to_s}]", options[:value], options[:checked], options)
    end
  end
end

现在可以使用全局方法和表单助手:

<%= wrapped_check_box_tag :accepts_terms %>

<%= f.wrapped_check_box :receives_updates, { checked: true } %>

如果有人有任何建议,我会洗耳恭听!