5

ブール値である仮想属性を機能させようとしています。この例では、仮想ブールフィールドを呼び出しますchildren

models / 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

Rails5attributeにこのためのメソッドが追加されました。

class Parent
  attribute :children, :boolean
end

これは正式には「属性API」と呼ばれ、ドキュメントは次の場所にあります:https ://api.rubyonrails.org/classes/ActiveRecord/Attributes/ClassMethods.html

于 2018-12-21T14:35:46.043 に答える
8

ブラウザから取得するパラメータは文字列です(他の回答へのコメントに基づく:«0と1を使用しているにもかかわらずtrueとfalseの代わりに"parent" => {"children" => "1"}») 。検証では、ブール値であるかどうかを確認します。

次の解決策をお勧めします。

まず、def self.children=()メソッドを削除します。現在の実装では何も実行されません(これはクラスメソッドであり、呼び出されることはありません)。

次に、Stringparamをブール値に変換するカスタムアクセサを実装します。

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

params [:children]が文字列である可能性はありますか?そしてそれはブール値を期待していました。

于 2012-08-07T23:48:48.310 に答える
1

子の「セッター」メソッドを手動で定義する必要はありません。これは、attr_accessorが自動的に行う方法とまったく同じだからです。def self.children =(boolean)メソッドを削除してみてください。

于 2012-08-08T00:14:53.930 に答える