无法设置 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>
这里有两个问题:
- 该字段是自动检查的,即使我传入
checked: false
- 这似乎是不正确的
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 } %>
如果有人有任何建议,我会洗耳恭听!
我正在尝试创建自定义表单帮助器方法(用于自定义 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>
这里有两个问题:
- 该字段是自动检查的,即使我传入
checked: false
- 这似乎是不正确的
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 } %>
如果有人有任何建议,我会洗耳恭听!