Rails存储方法将boolean转换为string

时间:2014-06-26 14:22:15

标签: ruby ruby-on-rails-4

我有一个类存储布尔属性,如:

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} >

我需要明确指定新的布尔值,所以我不想循环遍历参数并切换!如何防止值成为字符串?

2 个答案:

答案 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挂钩将遍历每个选项并将其转换为相应的布尔值。