Rails形成问题

时间:2011-05-24 15:38:33

标签: ruby-on-rails ruby-on-rails-3 formtastic

有一个布尔字段(使用formtastic),该值不会因错误而持续存在。如果提交并且存在错误,则在重新加载时,布尔字段会自动检查自身,这是不好的。我可以看到问题出现在冲突值中,隐藏为0而输入为1.两者都应为0.如何更正此值,以便最初都设置为0。我哪里错了?

表格代码:

<%= f.input :legal, :as => :boolean %>

Html Generated

<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只是重新呈现包含所有内联错误的表单

1 个答案:

答案 0 :(得分:0)

隐藏字段始终设置为“0”以模仿未选中的框,这是正确的行为: http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-check_box

相反,我建议您的isssue是模型中的访问方法。

如果@ user.legal是true类型,则检查复选框输入,或者更准确地说,如果

ActionView::Helpers::InstanceTag.check_box_checked?(@user.legal,"1")

评估为真。

现在,如果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 =&gt;未经检查的盒子。 但提交/重新加载!!"0"是真的=&gt;复选框。

让我知道我的预感是否正确:)