5

我试图让我的虚拟属性是一个可以工作的布尔值。在这个例子中,让我们调用虚拟布尔字段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

4 回答 4

11

Rails 5 现在添加了这个attribute方法。

class Parent
  attribute :children, :boolean
end

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

于 2018-12-21T14:35:46.043 回答
8

您从浏览器获得的参数是一个字符串(基于您对另一个答案的评论:«Instead of true and false 尽管它使用 0 和 1."parent"=>{"children"=>"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

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

于 2012-08-08T08:23:53.730 回答
1

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

于 2012-08-08T00:14:53.930 回答
1

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

于 2012-08-07T23:48:48.310 回答