Доступ к рельсам Flash [: Уведомление] в модели
-
01-10-2019 - |
Вопрос
Я пытаюсь присвоить сообщение на Flash [: уведомление] в модели наблюдателя.
Этот вопрос уже задан: Ruby on Rails: Наблюдатели и Flash [: Уведомление] Сообщения?
Тем не менее, я получаю следующее сообщение об ошибке, когда я пытаюсь получить доступ к нему в мою модели:
неопределенная локальная переменная или метод `Flash 'для #u003CModelObserver:0x2c1742c>
Вот мой код:
class ModelObserver < ActiveRecord::Observer
observe A, B, C
def after_save(model)
puts "Model saved"
flash[:notice] = "Model saved"
end
end
Я знаю, что метод называется, потому что «модель сохранена» напечатана к терминалу.
Можно ли получить доступ к вспышке внутри наблюдателя, а если да, как?
Решение
Мне нужно было установить flash[:notice]
В модели переопределить универсальный «@Model был успешным обновленным».
Это то, что я сделал
- Создал виртуальный атрибут в соответствующей модели под названием
flash_notice
- Затем я установил виртуальный атрибут в соответствующей модели при необходимости
- Использовал Affilter, когда этот виртуальный атрибут не был пустым, чтобы переопределить вспышку по умолчанию
Вы можете увидеть мой контроллер и модель, как я достиг этого ниже:
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
Другие советы
Нет, вы устанавливаете его в контроллер, где происходит экономия. flash
это метод, определенный на ActionController::Base
.