5

tengo un observador que se parece a esto:Rieles: Uso URL Helper con calidad de observador

class CommentObserver < ActiveRecord::Observer 
    include ActionView::Helpers::UrlHelper 

    def after_create(comment) 
     message = "#{link_to comment.user.full_name, user_path(comment.user)} commented on #{link_to 'your photo',photo_path(comment.photo)} of #{comment.photo.location(:min)}" 
     Notification.create(:user=>comment.photo.user,:message=>message) 
    end 

end 

Básicamente todo lo que estoy usando para hacer es crear un mensaje de notificación simple para un determinado usuario cuando alguien envía un comentario en una de sus fotos.

Esta falla con un mensaje de error:

NoMethodError (undefined method `link_to' for #<CommentObserver:0x00000102fe9810>): 

lo que habría esperado que incluye ActionView::Helpers::UrlHelper resolvería eso, sino que parece tener ningún efecto.

Entonces, ¿cómo puedo incluir el URL helper en mi observador, o de otra forma hacerlo de otra manera? Me encantaría mover la "vista de mensaje" a un parcial o algo, pero un observador no tiene vistas asociadas para mover esto a ...

Respuesta

2

Por lo tanto, resulta que esto no se puede hacer por la misma razón que no puede usar link_to en una vista de correo. El observador no tiene información sobre la solicitud actual y, por lo tanto, no puede usar los ayudantes de enlace. Tienes que hacerlo de otra manera.

3

¿Por qué no estás construyendo el mensaje cuando se procesa en la página y luego el almacenamiento en caché utilizando algo como esto?

<% cache do %> 
    <%= render user.notifications %> 
<% end %> 

Esto ahorraría tener que hacer un corte en el observador y sería más "compatible con las normas" en Rails.

+0

Esto no necesariamente enviará un correo electrónico. Intento crear un modelo simple que se pueda usar para crear un aviso (como el que se encuentra en desbordamiento de pila cuando alguien publica una respuesta a su pregunta). Dependiendo de la configuración del usuario, la Notificación puede enviar el mensaje por correo electrónico o simplemente ponerlo en el panel de un usuario. Este observador simplemente está creando un mensaje de notificación pertinente a un comentario que se está creando. Si tiene una mejor sugerencia para todo el sistema, avíseme, esto me ha estado matando hoy y no he podido encontrar un buen ejemplo de este tipo de sistema de notificación para estudiar. – Andrew

+0

... um Creo que editó después de que ya lo comenté ... :) Nunca he usado "caché" antes, ¿cómo funciona eso? – Andrew

2

Para manejar este tipo de cosas, hice un AbstractController para generar el cuerpo del correo electrónico, entonces yo paso que, en como una variable a la clase Mailer:

class AbstractEmailController < AbstractController::Base 

    include AbstractController::Rendering 
    include AbstractController::Layouts 
    include AbstractController::Helpers 
    include AbstractController::Translation 
    include AbstractController::AssetPaths 
    include Rails.application.routes.url_helpers 
    include ActionView::Helpers::AssetTagHelper 

    # Uncomment if you want to use helpers 
    # defined in ApplicationHelper in your views 
    # helper ApplicationHelper 

    # Make sure your controller can find views 
    self.view_paths = "app/views" 
    self.assets_dir = '/app/public' 

    # You can define custom helper methods to be used in views here 
    # helper_method :current_admin 
    # def current_admin; nil; end 

    # for the requester to know that the acceptance email was sent 
    def generate_comment_notification(comment, host = ENV['RAILS_SERVER']) 
     render :partial => "photos/comment_notification", :locals => { :comment => comment, :host => host } 
    end 
    end 

En mi observador:

def after_create(comment) 
    email_body = AbstractEmailController.new.generate_comment_notification(comment) 
    MyMailer.new(comment.id, email_body) 
    end 
Cuestiones relacionadas