我有一个类存储布尔属性,如:
class Robot
store :options, accessors: [:hairy, :smart]
after_initialize :set_defaults
private
def set_defaults
self.hairy ||= false
self.smart ||= true
end
end
我尝试使用button_to方法更新这些布尔值,但我的布尔值正在转换为存储哈希值中的字符串。我的默认是:
#<Robot id: 3, options: {"hairy"=>false,"smart"=>true} >
但是这个:
<%= button_to 'Make hairy', robot_path(@robot, hairy: true), method: :patch %>
变成&#34;多毛&#34;变成一个字符串:
#<Robot id: 3, options: {"hairy"=>"true","smart"=>true} >
我需要明确指定新的布尔值,所以我不想循环遍历参数并切换!如何防止值成为字符串?
答案 0 :(得分:0)
不确定这些字符串在哪个时候成为您应用程序中的问题,但是会覆盖默认访问者是一种解决方案吗?
def hairy
super.downcase == 'true'
end
def smart
super.downcase == 'true'
end
Rails文档中有更多信息:http://api.rubyonrails.org/classes/ActiveRecord/Store.html
答案 1 :(得分:0)
我最终决定的解决方案是:
class Robot
before_save :booleanize
private
def booleanize
self.options.each { |k, v| self.options[k] = to_boolean(v) }
end
def to_boolean(str)
str == 'true'
end
end
该按钮将“true”或“false”修补为字符串,但before_save挂钩将遍历每个选项并将其转换为相应的布尔值。