Mensaje flash de subdominio cruzado de Rails 3

¿Es posible configurar un mensaje flash [: aviso] que se configuraría en un controlador en www.example.com pero se leería y representaría en client.example.com?

En este caso particular, www.example.com y client.example.com están en la misma aplicación Rails 3.2.

Un usuario ingresa a través de www.example.com/signup, completa un formulario y luego es redirigido a un subdominio client.example.com recién creado.

¿Puedes hacer algo como:

flash[:notice] = "hello world", domain: "*.example.com"

preguntado el 10 de septiembre de 12 a las 22:09

Falta mucha información: ¿Es solo la misma aplicación, por ejemplo? Si crea un mensaje en la base de datos que se elimina tan pronto como se envía, puede hacer todo tipo de cosas. También puede enviarlos a través de http o whatdoiknow... Denos algunos más con los que trabajar, por favor. -

El flash de rieles no logra eso. Pero en ese mismo caso, crearía algún tipo de sesión con el usuario. Si la cookie de sesión es para .example.com, la sesión se puede compartir ya que la cookie de sesión está disponible para ambos subdominios. Luego, puede enviar información dentro de la sesión o almacenar el mensaje para su uso posterior en la base de datos y simplemente realizar una búsqueda cuando un usuario conectado llegue a la página de bienvenida del subdominio del cliente. -

3 Respuestas

Deberá asegurarse de que su sesión se pueda compartir en todos los subdominios. Abierto config/initializers/session_store.rb y agregue el :domain => :all opción:

Yourapp::Application.config.session_store :cookie_store, key: '_yourapp_session', :domain => :all

Respondido el 10 de Septiembre de 12 a las 22:09

Gracias por la respuesta también: la misma respuesta que @weexpectedTHIS, pero la tuya llegó unos minutos después. - cman77

Flash no es compatible con esto de fábrica. Si desea hacer algo como esto, deberá configurar una cookie en el dominio y luego recuperarla del subdominio.

Debe configurar el dominio de la cookie para que sea accesible en el subdominio. ¡Aquí hay un ejemplo que puede poner en su archivo de entorno o un inicializador mejor aún!:

Rails.application.config.session_store :cookie_store, :key => '_my_key', :domain => ".yourdomain.com"

Respondido el 10 de Septiembre de 12 a las 22:09

Gracias por la respuesta: esto pareció funcionar, aunque no funciona en localhost, pero estoy seguro de que solo se debe a los dominios locales que tengo configurados. - cman77

Sí, creo que todas las apuestas están canceladas con la configuración de localhost. - lo esperábamos

Una solución que no requiere sesiones compartibles entre subdominios es enviar el mensaje como un parámetro de solicitud.

# application_controller.rb

class ApplicationController
  before_action :handle_cross_domain_flash_messages

  def handle_cross_domain_flash_messages
    flash.alert = params[:alert] if params[:alert]
    flash.notice = params[:notice] if params[:notice]
  end
end

Ahora puedes usar cualquier ruta con :alert or :notice params para configurar los mensajes flash:

# example path
'/?alert=Hello+World'

# example controller
class PagesController
  def redirect_with_message
    redirect_to root_path(notice: 'Hello world')
  end
end

Sin embargo, hacer esto deja los parámetros en la barra de direcciones del navegador. Personalmente, no me gustan las direcciones muy largas en la barra de direcciones. Una forma de eliminar los parámetros de la barra de direcciones sin dejar de recibir los mensajes flash deseados es mediante la redirección.

# application_controller.rb

class ApplicationController
  before_action :handle_cross_domain_flash_messages

  def handle_cross_domain_flash_messages
    return unless params[:alert] || params[:notice]
    redirect_to request.path, alert: params[:alert], notice: params[:notice]
  end
end

Explicación paso a paso:

  1. La acción del controlador del tercer bloque de código nos redirigiría a '/?notice=Hello+world'.

  2. La handle_cross_domain_flash_messages verá que se pasó un mensaje flash a través de los parámetros y provocará otra redirección, y pasará los mensajes flash que se le dieron.

  3. La redirección irá a '/' ahora, una ruta limpia en el navegador. Los mensajes flash están en la página.

Tomó una redirección adicional, pero bueno, no se usaron sesiones globales.

respondido 02 mar '17, 22:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.