7

次のモデルがあるとします。

user.rb

has_many :favorites, dependent: :destroy
has_many :sports, through: :favorites

スポーツ.rb

has_many :favorites, dependent: :destroy
has_many :users, through: :favorites

新しいユーザーを作成するためのフォームには、スポーツのチェックボックスのリストがあり、ユーザーの検証では、少なくとも 1 つが選択されていることを検証したいと考えています。

私はこのようにやっています:

ユーザーコントローラーの作成アクションで:

@user = User.new(params[:user])
@user.sports << Sport.find(params[:sports]) unless params[:sports].nil?

if @user.save ...

ユーザーモデルでは

validate :user_must_select_sport

def user_must_select_sport
  if sports.empty?
    errors.add(:Sport, "You have to select at least 1 sport")
  end
end

実際には機能していますが、これを行うにはもっと良い方法である必要があると思います。助けていただければ幸いです。

4

1 に答える 1

8

「validates_presence_of」を使用できます

class User < ActiveRecord::Base
  has_many :sports
  validates_presence_of :sports
end

accepts_nested_attributes_forただし、 で使用する場合はバグがあります:allow_destroy => true

これを調べることができます:ネストされたモデルと親の検証

于 2013-01-27T15:02:14.503 に答える