如何使虚拟属性成为布尔字段

时间:2012-08-07 23:22:52

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

我正在尝试将我的虚拟属性设置为布尔值。在此示例中,我们调用虚拟布尔字段children

模型/ parent.rb

Parent
 attr_accessible :children
 attr_accessor :children
 validates_inclusion_of :children, :in => [true, false]

 def self.children=(boolean)
 end

end

父母/ new.html.erb

<%= form_for @parent do |f| %>
  <%= f.check_box :children %>
  <%= f.submit "Create" %>
<% end %>

现在当我尝试使用它时,(创建一个父级)它会给我错误

Children is not included in the list

验证结束时。

我该怎么写?

4 个答案:

答案 0 :(得分:8)

您从浏览器获得的参数是一个字符串(根据您对其他答案的评论:«而不是真和假,但使用0和1.“parent”=&gt; {“children”=&gt;“ 1" }»)。您的验证将检查它是否为布尔值。

我建议采用以下解决方案:

首先,删除你的def self.children=()方法,它在你当前的实现中什么都不做(它是一个类方法,从不调用)。

然后,实现一个自定义访问器,将String参数转换为布尔值:

class Parent
  attr_reader :children

  def children=(string_value)
    @children = (string_value == '1')
  end

  validates_inclusion_of :children, :in => [true, false]
end

这样你的原始验证应该可以正常工作。

答案 1 :(得分:3)

Rails 5现在为此添加了attribute方法。

class Parent
  attribute :children, :boolean
end

它正式称为“属性API”,您可以在这里找到文档:https://api.rubyonrails.org/classes/ActiveRecord/Attributes/ClassMethods.html

答案 2 :(得分:1)

params [:children]是否可能是一个字符串?并且它期望一个布尔值。

答案 3 :(得分:1)

无需手动定义子“setter”方法,因为这正是attr_accessor自动执行的操作。尝试删除def self.children =(boolean)方法。