¿Cómo puedo acceder a el Estante medio ambiente desde dentro de Rails?
-
21-08-2019 - |
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
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
oenv
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 derack.session
en el estante medio ambiente
En el middleware...
- Acceder a las propiedades del entorno de la forma habitual a través del entorno de hash
- El acceso de los Rieles de la sesión a través de la
rack.session
propiedad en el entorno de hash - Lectura de parámetros a través de
Rack::Request#params
- Actualización de parámetros a través de
Rack::Request#update_param
yRack::Request#delete_param
(como se indica en la documentación de lasRack::Request#params
) - Actualización de parámetros en un Rieles de manera específica el uso de
ActionDispatch::Http::Parameters#params
a través deActionDispatch::Request