2010-04-23 18 views
12

Próbuję przypisać wiadomość do flash [: notice] w modelu obserwatora.Dostęp do szyny flash [: notice] w modelu

To pytanie zostało już zadane: Ruby on Rails: Observers and flash[:notice] messages?

jednak, pojawia się następujący komunikat o błędzie, gdy próbuję uzyskać do niego dostęp w moim modelu

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

Oto mój kod:

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

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

Wiem, że metoda jest wywoływana, ponieważ "Zapisany model" jest drukowany na terminalu.

Czy można uzyskać dostęp do lampy błyskowej wewnątrz obserwatora, a jeśli tak, to w jaki sposób?

+1

poprawny technicznie rozwiązanie, które przełamuje MVC: http://stackoverflow.com/questions/393395/how-to-call-expire-fragment-from-rails-observer-model/608700#608700 prawo – titaniumdecoy

Odpowiedz

11

Potrzebowałem ustawić flash[:notice] w modelu, aby nadpisać ogólny "@model został pomyślnie zaktualizowany".

To co zrobiłem

  1. Utworzono atrybutu wirtualny w danym modelu o nazwie flash_notice
  2. Potem ustawić atrybut wirtualny w danym modelu, gdy są potrzebne
  3. użył after_filter gdy atrybut ten wirtualny był nie puste, aby zastąpić domyślną lampę błyskową

Możesz zobaczyć mój kontroler i model jak to zrobić poniżej:

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 [email protected]_notice.blank? 
     flash[:notice] = @reservation.flash_notice 
    end 
    end 
end 
+0

Upraszczasz warunek 'if' do' @ reservation.flash_notice.present? 'Zamiast" 'not blank?' " – Besi

17

Nie, ustawia się w sterowniku, w którym odbywa się zapisywanie. flash to metoda zdefiniowana na ActionController::Base.

+6

Ryana chociaż . Powinieneś ustawić lampę błyskową w sterowniku ... jest to funkcja warstwy prezentacji widoku. "Odpowiedź" powyżej to dużo niebezpiecznego podnoszenia ciężarów, aby to zadziałało. –

+0

Jak powiedziałem w swoim poście, ustawienie lampy błyskowej w kontrolerze jest niepraktyczne (o ile jest to możliwe) w mojej aplikacji. Potrzebuję dodać wiadomość do lampy błyskowej za każdym razem, gdy model jest aktualizowany; Nie jestem świadomy innej metody - przynajmniej bez rzucania na ścianę tablicy kodu spaghetti. – titaniumdecoy

+0

Również dzisiaj zmagałem się z tym krótko, ale po rozwiązaniu mojego dylematu widzę, że odpowiedziałeś na swoje pytanie w komentarzu tuż nad moim. "Potrzebuję dodać wiadomość do lampy błyskowej za każdym razem, gdy model jest aktualizowany." Wiem, że powiedziałeś, że to niepraktyczne, ale umieściłem swój flesz w metodzie aktualizacji kontrolera. (Wystąpił wyjątek, a następnie migał błąd). – Tass

Powiązane problemy