在模型中访问rails flash [:notice]

tit*_*coy 12 activerecord ruby-on-rails rails-flash

我试图在模型观察者中为flash [:notice]分配一条消息.

这个问题已经被问到:Ruby on Rails:Observers和flash [:notice]消息?

但是,当我尝试在我的模型中访问它时,我收到以下错误消息:

undefined local variable or method `flash' for #<ModelObserver:0x2c1742c>

这是我的代码:

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

  def after_save(model)
    puts "Model saved"
    flash[:notice] = "Model saved"
  end
end
Run Code Online (Sandbox Code Playgroud)

我知道正在调用该方法,因为"模型保存"被打印到终端.

是否有可能在观察者内部访问闪存,如果是这样,怎么办?

Rya*_*igg 20

不,您将其设置在正在进行保存的控制器中.flash是一种定义的方法ActionController::Base.

  • 瑞安是对的.你应该在控制器中设置闪光灯...它是视图表示层的一个功能.上面的"答案"是很多危险的繁重工作. (7认同)
  • 有时世界并不像你想要的那么简单.我需要将flash从Monkey修补扩展设置为Sunspot/RSolr,这是在请求周期期间从不同线程上的模型回调触发的.请不要回答显而易见的问题.你当然可以提到它通常以一种方式完成,但除非它直接回答问题,否则根本没有用. (5认同)
  • 我认为定义像“validation_messages”这样的模型 attr_accessor 然后在控制器“after_action”回调中检查它以根据validation_messages值设置闪存(在控制器内部)没有问题。 (2认同)

the*_*gah 10

我需要flash[:notice]在模型中设置覆盖通用"@model已成功更新".

这就是我做的

  1. 在相应的模型中创建了一个名为的虚拟属性 flash_notice
  2. 然后我在需要时在相应的模型中设置虚拟属性
  3. 当此虚拟属性不为空时使用after_filter来覆盖默认闪存

您可以在下面看到我的控制器和模型,如何完成此操作:

class Reservation < ActiveRecord::Base

  belongs_to :retailer
  belongs_to :sharedorder
  accepts_nested_attributes_for :sharedorder
  accepts_nested_attributes_for :retailer

  attr_accessor :validation_code, :flash_notice

  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.flash_notice = "Your validation as successful and you will not need to do that again"
    end
  end
end

class ReservationsController < ApplicationController

  before_filter :authenticate_retailer!
  after_filter :flash_notice, :except => :index

  def flash_notice
    if !@reservation.flash_notice.blank?
      flash[:notice] = @reservation.flash_notice
    end
  end
end
Run Code Online (Sandbox Code Playgroud)