Доступ к рельсам мигает [: note] в модели - PullRequest
12 голосов
/ 24 апреля 2010

Я пытаюсь назначить сообщение для мигания [: note] в наблюдателе модели.

Этот вопрос уже задавался: Ruby on Rails: наблюдатели и флеш-сообщения [: note]?

Тем не менее, я получаю следующее сообщение об ошибке при попытке доступа к нему в моей модели:

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

Я знаю, что метод вызывается, потому что "Модель сохранена" напечатана на терминале.

Можно ли получить доступ к вспышке внутри наблюдателя, и если да, то как?

Ответы [ 2 ]

20 голосов
/ 24 апреля 2010

Нет, вы устанавливаете его в контроллере, где происходит сохранение. flash - это метод, определенный для ActionController::Base.

10 голосов
/ 30 июля 2010

Мне нужно было установить 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...