2016-03-26 11 views
1

私はGroupモデルとMessageモデルを持っています。それぞれHABTMです。私は特定のグループにSMSを送信する私のメインフォームの検証を設定しようとしています。今すぐメッセージボディをpresence: trueで検証していますが、それはうまくいきますが、私のグループモデルでは名前が存在することを検証したいのですが、メッセージコントローラでcreateメソッドを呼び出すときに両方を検証する方法はありますか?より明確にするために私のコードを示します。Rails検証を設定しています。 2つのモデルを1つの形式で使用する

ここ

今すぐgroup.rb

class Group < ActiveRecord::Base 
    has_and_belongs_to_many :people 
    has_and_belongs_to_many :messages 
    validates :name, presence: true 
    end 

あるmessage.rb

class Message < ActiveRecord::Base 
    has_and_belongs_to_many :groups 

    validates :body, presence: true 
end 

ここに私のmessage_controller.rb

def create 
@message = Message.create(message_params) 
if @message.save 
    run_at_time = @message.send_at.present? ? @message.send_at : Time.zone.now 
    people = Person.in_groups(message_params[:group_ids]) 
    if people.any? 
    people.each do |person| 
     person.delay(run_at: run_at_time).send_message(@message.body) 
    end 
    flash[:success] = "Messages on their way!" 
    end 
    redirect_to root_path 
else 
    render "new" 
end 
end 

enter image description here

です3210

私は自分のフォームに「グループは空白にできません」と「本文は空にできません」と表示するようにします。何も選択されていない場合。

答えて

1

valid?を使用することが最初に起こったことですが、別の方法もあります。

モデルの検証には、実際に組み込みのサポートが組み込まれています。

例えば、

class Message 
    has_and_belongs_to_many :groups 
    validates :groups, presence: true 
end 

this StackOverflow answerを参照してください。

メッセージがグループを持たない場合、これにより、saveが失敗します。

いつも別の方法があります。valid?を無効にすることができます。内部的には と呼ばれ、saveとなります。たとえば:

class Message 
    def valid?(*args) 
    original_result = super(*args) 
    if self.groups.empty? 
     self.errors_add(:groups, "cannot be empty") 
     return false 
    end 
    return original_result 
    end 
end 

これは主に私がpresence: trueも外部キーは 有効なレコード(だけではなく、関連するすべてのレコードが存在することを確認)を参照していることを確認すると思いますがvalidates :groups, presence: true、 によって達成同じものです。

valid?を呼び出すと、errorsオブジェクトが読み込まれるという副作用があります。例:

msg = Message.new 
    msg.errors.full_messages # => [] 
    msg.valid? # => false 
    msg.errors.full_messages # => ["Name cant be blank", "Groups cant be blank"] 
    msg.save # => false 
2

すべてのエラーを保存または収集する前に複数のモデルを検証したい場合は、model.valid?メソッドを使用してエラーを解決できます。 エラーがあるかどうかによって、falseのtrueを返します。エラーはmodel.errorsに追加されます。

関連する問題