【问题标题】:How to make a virtual attribute be a boolean field如何使虚拟属性成为布尔字段
【发布时间】:2012-08-07 23:22:52
【问题描述】:

我正在尝试让我的虚拟属性是一个可以工作的布尔值。在这个例子中,我们调用虚拟布尔字段children

models/parent.rb

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

 def self.children=(boolean)
 end

end

parents/new.html.erb

<%= form_for @parent do |f| %>
  <%= f.check_box :children %>
  <%= f.submit "Create" %>
<% end %>

现在当我尝试使用它时,(创建父级)它给了我错误

Children is not included in the list

当验证出现时。

我该怎么写?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1


    【解决方案1】:

    Rails 5 现在为此添加了 attribute 方法。

    class Parent
      attribute :children, :boolean
    end
    

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

    【讨论】:

      【解决方案2】:

      您从浏览器获得的参数是一个字符串(基于您对另一个答案的评论:«Instead of true and 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
      

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

      【讨论】:

      • 谢谢。还在努力理解 ruby​​,不胜感激!
      • 但还是很难看。应该在某处实现 boolean_attr_accessor。如果没有,那就太棒了:)
      【解决方案3】:

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

      【讨论】:

      • 当我查看表单时,它实际上是一个hidden 输入。嗯......即&lt;input name="parent[children]" type="hidden" value="0"&gt;。是这个意思吗?
      • 如果您检查控制台并查看参数,我认为 children 将是一个字符串而不是布尔值。所以验证不匹配 true != "true"
      • 我现在明白了。虽然它使用 0 和 1,但不是真假。“父”=>{“子”=>“1”}。现在我把这个验证改为:validates_inclusion_of :children, :in =&gt; [1, 0] 但为什么它不起作用?或者更好的是,我可以将其更改为使用 true 和 false 吗?
      • 一个解决方案应该是使用自定义验证 => guides.rubyonrails.org/…
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-23
        • 1970-01-01
        • 2018-09-21
        • 2019-02-25
        • 1970-01-01
        相关资源
        最近更新 更多