13

モデル オブザーバーで flash[:notice] にメッセージを割り当てようとしています。

この質問はすでに尋ねられています: Ruby on Rails: Observers and flash[:notice] messages?

ただし、モデルでアクセスしようとすると、次のエラー メッセージが表示されます。

#<ModelObserver:0x2c1742c> の未定義のローカル変数またはメソッド「flash」

これが私のコードです:

class ModelObserver < ActiveRecord::Observer
  observe A, B, C

  def after_save(model)
    puts "Model saved"
    flash[:notice] = "Model saved"
  end
end

「モデルが保存されました」が端末に出力されるため、メソッドが呼び出されていることがわかります。

オブザーバー内のフラッシュにアクセスすることは可能ですか?もしそうなら、どのように?

4

2 に答える 2

20

いいえ、保存が行われているコントローラーで設定します。flashで定義されたメソッドActionController::Baseです。

于 2010-04-24T02:17:02.053 に答える
13

flash[:notice]一般的な「@modelが正常に更新されました」をオーバーライドするようにモデルを設定する必要がありました。

これは私がしたこと

  1. と呼ばれるそれぞれのモデルに仮想属性を作成しましたvalidation_message
  2. 次に、必要に応じて、それぞれのモデルに仮想属性を設定します
  3. この仮想属性が空白でない場合に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

于 2010-07-29T22:14:15.650 に答える