问题描述
|
有一个布尔字段(使用形式),该值将不会因错误而持续存在。如果提交并且存在错误,则在重新加载时,布尔值字段会自动检查自身,这很糟糕。我可以看到问题出在冲突值上,hidden是0,而输入是1。两者都应为0。如何更正此错误,因此最初都设置为0。我要去哪里错了?
表格代码:
<%= f.input :legal,:as => :boolean %>
HTML生成
<li class=\"boolean optional\" id=\"user_legal_input\">
<input name=\"user[legal]\" type=\"hidden\" value=\"0\" />
<label for=\"user_legal\">
<input id=\"user_legal\" name=\"user[legal]\" type=\"checkBox\" value=\"1\" />I Agree to the legal terms
</label>
</li>
添加:用户(创建)控制器
def create
@user = User.new(params[:user])
respond_to do |format|
if @user.save
format.js
else
format.js
end
end
end
js只是重新渲染表单并内联所有错误
解决方法
隐藏字段始终设置为\“ 0 \”以模仿未选中的框,这是正确的行为:
http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-check_box
相反,我建议您的问题是模型中的访问器方法。
如果@ user.legal是真实类型,则检查复选框输入,或更准确地说是
ActionView::Helpers::InstanceTag.check_box_checked?(@user.legal,\"1\")
评估为true。
现在,如果legal是布尔型数据库列,则Rails初始化程序会将其转换为ruby布尔型,因此如果您这样做
@user = User.new(:legal => \"0\")
然后
@user.legal == false
但是,如果legal不是db列(否则不需要“ 6”),则必须以某种方式定义了访问器方法。
如果您使用简单的attr_accessor做到这一点,
@user.legal == \"0\"
正确计算为未选中的框。
但是,如果您或您的框架想要使Rails超越智能,那么您可以定义:
attr_writer :legal
def legal
!!@legal
end
或类似的东西(为您提供适当的布尔值),那么您就会遇到麻烦:
此处初始格式显示!!nil
为false =>未选中的框。
但是在提交/重新加载时,!!\"0\"
为true =>复选框。
让我知道我的直觉是否正确:)