flash[:notice]
一般的な「@modelが正常に更新されました」をオーバーライドするようにモデルを設定する必要がありました。
これは私がしたこと
- と呼ばれるそれぞれのモデルに仮想属性を作成しました
validation_message
- 次に、必要に応じて、それぞれのモデルに仮想属性を設定します
- この仮想属性が空白でない場合にafter_actionを使用して、デフォルトのフラッシュをオーバーライドしました
私のコントローラーとモデルを以下で確認できます。
class Reservation < ActiveRecord::Base
belongs_to :retailer
belongs_to :sharedorder
accepts_nested_attributes_for :sharedorder
accepts_nested_attributes_for :retailer
attr_accessor :validation_code, :validation_messages
validate :first_reservation, :if => :new_record_and_unvalidated
def new_record_and_unvalidated
if !self.new_record? && !self.retailer.validated?
true
else
false
end
end
def first_reservation
if self.validation_code != "test" || self.validation_code.blank?
errors.add_to_base("Validation code was incorrect")
else
self.retailer.update_attribute(:validated, true)
self.validation_message = "Your validation is successful and you will not need to do that again"
end
end
end
class ReservationsController < ApplicationController
before_filter :authenticate_retailer!
after_filter :validation_messages, :except => :index
def validation_messages
return unless @reservation.validation_message.present?
flash[:notice] = @reservation.validation_message
end
end
考えられるリファクタリングの1つは、実際のメッセージを適切なファイル(ロケールなど)に移動しvalidation_message
、適切なキーのみに渡すことです。
複数の通知が必要な場合は、配列またはハッシュに変換して、代わりにvalidation_message
呼び出すのは簡単です。validation_messages