滑轨形式问题

问题描述

| 有一个布尔字段(使用形式),该值将不会因错误而持续存在。如果提交并且存在错误,则在重新加载时,布尔值字段会自动检查自身,这很糟糕。我可以看到问题出在冲突值上,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 =>复选框。 让我知道我的直觉是否正确:)