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

一种可能的重构方法是将实际消息移动到适当的文件(例如语言环境)中并validation_message仅传递给适当的键。

如果您需要多个通知,则很容易将其validation_message转换为数组或散列并调用它validation_messages

于 2010-07-29T22:14:15.650 回答