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

Ruby on rails 如何使虚拟属性成为布尔字段,ruby-on-rails,ruby,ruby-on-rails-3,ruby-on-rails-3.1,Ruby On Rails,Ruby,Ruby On Rails 3,Ruby On Rails 3.1,我正在尝试获取一个布尔值的虚拟属性。在本例中,让我们调用虚拟布尔字段子项: 型号/parent.rb Parent attr_accessible :children attr_accessor :children validates_inclusion_of :children, :in => [true, false] def self.children=(boolean) end end <%= form_for @parent do |f| %> &

我正在尝试获取一个布尔值的虚拟属性。在本例中,让我们调用虚拟布尔字段
子项

型号/parent.rb

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

 def self.children=(boolean)
 end

end
<%= form_for @parent do |f| %>
  <%= f.check_box :children %>
  <%= f.submit "Create" %>
<% end %>
parents/new.html.erb

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

 def self.children=(boolean)
 end

end
<%= form_for @parent do |f| %>
  <%= f.check_box :children %>
  <%= f.submit "Create" %>
<% end %>
当验证出现时


我如何写这个?

参数[:children]可能是字符串吗?它需要一个布尔值。

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

从浏览器中获得的参数是一个字符串(根据您对另一个答案的评论:«而不是true和false,尽管它使用0和1。“parent”=>{“children”=>“1”}。验证将检查它是否为布尔值

我建议采取以下解决办法:

首先,删除您的
def self.children=()
方法,它在您当前的实现中根本不起任何作用(它是一个类方法,从未被调用)

然后,实现将字符串参数转换为布尔值的自定义访问器:

class Parent
  attr_reader :children

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

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

这样,您的原始验证就可以正常工作了。

Rails 5现在为此添加了
属性
方法

class Parent
  attribute :children, :boolean
end

它的正式名称是“attributes API”,您可以在这里找到文档:

当我查看表单时,它实际上是一个
隐藏的
输入。嗯。。。。。i、 e.
。这就是你的意思吗?如果你检查控制台并看到参数,我想孩子们将是一个字符串而不是布尔值。因此验证不符合true!=“真的”我现在明白了。虽然它使用0和1,但不是true和false。“父”=>{“子”=>“1”}。现在我将此验证改为:
验证包含的:子项,:in=>[1,0]
但为什么不起作用?或者更好,我可以将其更改为true和false吗?一个解决方案应该是使用自定义验证=>谢谢。仍在努力理解ruby,非常感谢!但还是很丑。应该在某个地方实现布尔属性访问器。如果不是,那就太神奇了:)