Pregunta

Tengo una aplicación Rack que se parece a esto:

class Foo
  def initialize(app)
    @app = app
  end
  def call(env)
    env["hello"] = "world"
    @app.call(env)
  end
end

Después de conectar mi Rack de aplicación en Rails, ¿cómo puedo obtener acceso a env["hello"] desde dentro de Rails?

Actualización:Gracias a Gayo por la respuesta.Bastidor y Travesaños permiten almacenar cosas para la duración de la solicitud, o de la duración de la sesión:

# in middleware
def call(env)
  Rack::Request.new(env)["foo"] = "bar"  # sticks around for one request

  env["rack.session"] ||= {}
  env["rack.session"]["hello"] = "world" # sticks around for duration of session
end

# in Rails
def index
  if params["foo"] == "bar"
    ...
  end
  if session["hello"] == "world"
    ...
  end
end
¿Fue útil?

Solución

Estoy bastante seguro de que puede utilizar el Rack::Request objeto para pasar variables solicitud de alcance:

# middleware:
def call(env)
  request = Rack::Request.new(env) # no matter how many times you do 'new' you always get the same object
  request[:foo] = 'bar'
  @app.call(env)
end

# Controller:
def index
  if params[:foo] == 'bar'
    ...
  end
end

Como alternativa, se puede conseguir por lo que "env" objeto directamente:

# middleware:
def call(env)
  env['foo'] = 'bar'
  @app.call(env)
end

# controller:
def index
  if request.env['foo'] == 'bar'
    ...
  end
end

Otros consejos

Respuesta corta: Uso request.env o env dentro de un controlador.

Respuesta larga:

De acuerdo a la Rieles de Guía on Rails controladores, ActionController proporciona un request método que puede utilizar para acceder a información sobre la solicitud HTTP a su controlador está respondiendo.

Tras una inspección más de los documentos ActionController::Base#request, vemos que se "Devuelve un ActionDispatch::Solicitar a la instancia que representa a la solicitud actual."

Si nos fijamos en los documentos ActionDispatch::Request, vemos que se hereda de Rack::Request.Aha!Aquí vamos.

Ahora, en caso de que usted no está familiarizado con la documentación de las Rack::Request, es básicamente un contenedor alrededor de la Rejilla de medio ambiente.Así que para la mayoría de los casos, usted debería ser capaz de utilizar como está.Si usted realmente desea el crudo ambiente hash, sin embargo, usted puede conseguir con Rack::Request#env.Así que dentro de los Carriles de la controladora, que acaba de ser request.env.

Profundizando:

Después de examinar más a fondo los métodos de instancia de ActionController::Base, Me di cuenta de que no hay mucho allí para mirar.En particular, me di cuenta de la params y session variables parecen estar ausentes.Así que se trasladó hasta un nivel a ActionController::Metal, que ActionController::Base hereda.

En ActionController::Metal, Descubrí un método env que no tenía la documentación en cuanto a lo que hizo - pero yo podría adivinar.Resulta que yo estaba en lo correcto.Esa variable fue de ser asignado a la request.env.

ActionController::Metal también contenía la params el método, que, de acuerdo a la fuente, fue establecida para request.parameters de forma predeterminada.Como resulta, request.parameters no es de Rack::Request, pero ActionDispatch::Http::Parámetros, que se incluye por ActionDispatch::Request.Este método es muy similar a la Rack::Request#params método, salvo que la alteración modifica Rails-Rack específico variable de entorno (y por lo tanto, los cambios seguirán siendo persistente en los casos de ActionDispatch::Request).

Sin embargo, todavía no podía encontrar la session método.Resulta, no en la documentación a todos.Después de buscar en el código fuente para ActionController::Metal, Finalmente me encontré en esta línea.Eso es correcto, no es sólo un acceso directo para solicitud.sesión.

Para resumir:

En el controlador de...

  • Uso request.env o env para obtener las primas objeto del entorno
  • Uso params para leer Bastidor de cadenas de consulta y posterior de los datos de la rejilla de entrada de corriente.(E. g. Rack::Request#params)
  • Uso session para acceder al valor de rack.session en el estante medio ambiente

En el middleware...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top