2010-04-23 10 views
12

Estoy tratando de asignar un mensaje a flash [: aviso] en un modelo de observador.Acceso a los raíles flash [: aviso] en un modelo

Esta pregunta ya ha sido pedido: Ruby on Rails: Observers and flash[:notice] messages?

Sin embargo, me sale el siguiente mensaje de error cuando intento acceder a ella en mi modelo:

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

Aquí está mi código:

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

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

Sé que se está llamando al método porque "Modelo guardado" se imprime en el terminal.

¿Es posible acceder al flash dentro de un observador y, de ser así, cómo?

+1

solución técnicamente válida que rompe MVC: http://stackoverflow.com/questions/393395/how-to-call-expire-fragment-from-rails-observer-model/608700#608700 derecho – titaniumdecoy

Respuesta

11

Necesitaba establecer flash[:notice] en el modelo para anular el genérico "@model se ha actualizado satisfactoriamente".

Esto lo hice

  1. Creado Un atributo virtual en el modelo respectivo llamado flash_notice
  2. Luego de establecer el atributo virtual en el modelo correspondiente cuando sea necesario
  3. realizará una after_filter cuando este atributo virtual era no en blanco para anular el flash predeterminado

Puede ver mi controlador y modelo de cómo lo he realizado a continuación:

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

Simplifica su condición 'if' en' @ reservation.flash_notice.present? 'En lugar de' 'not blank?' " – Besi

17

No, lo configura en el controlador donde se está produciendo el guardado. flash es un método definido en ActionController::Base.

+6

de Ryan aunque . Debería configurar el flash en el controlador ... es una función de la capa de presentación de la vista. La "respuesta" anterior es una gran cantidad de trabajo pesado y peligroso para que funcione. –

+0

Como dije en mi publicación, configurar el flash en el controlador no es práctico (si es posible) en mi aplicación. Necesito agregar un mensaje al flash cada vez que se actualiza un modelo; No conozco otro método para hacerlo, al menos sin tirar un plato de código de espagueti en la pared. – titaniumdecoy

+0

Luché con esto brevemente también hoy, pero después de haber resuelto mi propio dilema, veo que ha respondido a su pregunta en el comentario justo encima del mío. "Necesito agregar un mensaje al flash cada vez que se actualiza un modelo". Sé que dijiste que no era práctico, pero coloqué mi flash dentro del método de actualización de mi controlador. (Capturaba una excepción y luego parpadeaba un error.) – Tass

Cuestiones relacionadas