我正在尝试将我的虚拟属性设置为布尔值。在此示例中,我们调用虚拟布尔字段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
验证结束时。
我该怎么写?
答案 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)方法。