有一个布尔字段(使用formtastic),该值不会在错误中持续存在。如果已提交并且存在错误,则在重新加载时,布尔字段会自动检查自身,这是错误的。我可以看出问题在于冲突的值,隐藏的是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>
ADDED:用户(创建)控制器
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
相反,我建议您的issue是模型中的访问器方法。
如果@user.legal是true类型,或者更准确地说,如果是
ActionView::Helpers::InstanceTag.check_box_checked?(@user.legal,"1")
评估为true。
现在,如果legal是一个布尔型数据库列,rails初始值设定项会将其转换为ruby布尔型,所以如果您执行
@user = User.new(:legal => "0")
然后
@user.legal == false
但是如果legal不是db列(否则:as => :boolean
是不必要的),那么您一定以某种方式定义了一个访问器方法。
如果你用一个简单的attr_accessor来完成,那么
@user.legal == "0"
其正确地评估为未选中的框。
但如果你或你的框架想智胜rails,你定义:
attr_writer :legal
def legal
!!@legal
end
或者类似的东西(给你一个合适的布尔值),那么你就有麻烦了:
此处初始表单显示!!nil
为false=>未选中框。但在提交/重新加载时,CCD_ 3为true=>复选框。
如果我的预感是正确的,请告诉我:)