2011-05-24 80 views
2

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

表格代号:

<%= 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

张贴相关的控制器动作(创建/更新)代码,请 – 2011-05-24 16:36:31

+0

如果你有一个'在你的模型(user.rb)attr_accessible'部分,确保您已将':legal'添加到列表中。 – 2011-05-24 17:30:47

+0

@john Gibb,它是。问题是初始值冲突 – John 2011-05-24 17:33:10

回答

0

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

相反,我建议您的isssue是您在模型中的访问器方法。如果@ user.legal是真实的类型,或者更确切地说,如果

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

计算结果为真

复选框输入被选中。

现在,如果法律是一个布尔数据库列,轨道初始化将其转换为红宝石布尔所以如果你做

@user = User.new(:legal => "0") 

然后

@user.legal == false 

但如果法律是不是数据库列(否则:as => :boolean是不必要的),那么你必须以某种方式定义访问器方法。

如果你用一个简单的attr_accessor那么做了,

@user.legal == "0" 

其正确的计算结果为未经检查的框。

,但如果你或你的框架要智取轨和定义:

attr_writer :legal 
def legal 
[email protected] 
end 

或罩(给你一个正确的布尔回)下类似的东西,那你就麻烦了:

此处初始表单显示!!nil为false =>未选中框。 ,但在提交/重新加载!!"0"是真=>复选框。

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

+0

认为它的工作,但它没有。:法律不是一个数据库列,它是一个attr_ccessible,它是问题的一部分。找不到如何将其定义为访问器方法 – John 2011-05-26 17:40:23

+0

John您正在使用什么ORM? ActiveRecord的?您是如何定义合法访问方法的?你的任务是否做过任何转化? – 2011-05-27 09:37:56

+0

感谢您的帮助,但我决定遵循您的简单建议,并添加一个名为legal的数据库列。 – John 2011-05-29 23:06:03