كيف يمكنني الوصول إلى الرف البيئة من داخل القضبان ؟
-
21-08-2019 - |
سؤال
لدي رف التطبيق الذي يبدو مثل هذا:
class Foo
def initialize(app)
@app = app
end
def call(env)
env["hello"] = "world"
@app.call(env)
end
end
بعد تركيب رف لي تطبيق في القضبان, كيف يمكنني الحصول على env["hello"]
من داخل القضبان ؟
التحديث:بفضل جايوس عن الجواب.رف القضبان تتيح لك تخزين الأشياء مدة الطلب ، أو مدة الدورة:
# 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
المحلول
وأنا متأكد يمكنك استخدام الكائن Rack::Request
لتمرير المتغيرات طلب النطاق:
# 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
وبدلا من ذلك، يمكنك الحصول على أنه "env
" الكائن مباشرة:
# middleware:
def call(env)
env['foo'] = 'bar'
@app.call(env)
end
# controller:
def index
if request.env['foo'] == 'bar'
...
end
end
نصائح أخرى
الجواب القصير: استخدام request.env
أو env
داخل وحدة تحكم.
الجواب طويل:
وفقا القضبان دليل على القضبان تحكم, ActionController يوفر request
طريقة التي يمكنك استخدامها للوصول إلى المعلومات حول طلب HTTP جهاز تحكم يستجيب.
عند التفتيش مزيد من مستندات ActionController::Base#request
, نرى أن "بإرجاع ActionDispatch::طلب سبيل المثال أن يمثل الطلب الحالي."
إذا نظرنا إلى مستندات ActionDispatch::Request
, نرى أنه يرث من Rack::Request
.آها!هنا نذهب.
الآن, في حال كنت لم تكن مألوفة مع مستندات Rack::Request
, انها في الأساس التفاف حول رف البيئة.حتى بالنسبة لمعظم الحالات ، عليك أن تكون قادرا على استخدامها كما هي.إذا كنت تريد حقا الخام بيئة التجزئة على الرغم من يمكنك الحصول عليه مع Rack::Request#env
.حتى داخل القضبان تحكم سيكون request.env
.
حفر أعمق:
بعد مزيد من دراسة أساليب المثال من ActionController::Base
, لاحظت أن ليس هناك الكثير هناك أن ننظر إلى.ولا سيما لاحظت params
و session
يبدو أن المتغيرات يكون في عداد المفقودين.حتى انتقلت مستوى واحد لأعلى ActionController::Metal
, ، ActionController::Base
يرث من.
في ActionController::Metal
, اكتشفت طريقة env
التي لم يكن أي من الوثائق ما فعلت - ولكن لا يمكن تخمين.تبين أنني كنت على حق.هذا المتغير يجري تعيين request.env
.
ActionController::Metal
يتضمن أيضا params
الطريقة التي ، وفقا المصدر, تم تعيين request.parameters
بشكل افتراضي.كما اتضح ، request.parameters
ليس من Rack::Request
, ولكن ActionDispatch::: Http:المعلمات, التي يتم تضمينها من قبل ActionDispatch::Request
.هذه الطريقة هي مشابهة جدا Rack::Request#params
طريقة إلا أن تغيير هذا يعدل القضبان محددة رف متغير البيئة (وبالتالي التغييرات سوف تظل ثابتة في جميع الحالات ActionDispatch::Request
).
ولكن ما زلت لا يمكن أن يبدو للعثور على session
الأسلوب.اتضح أنه ليس في الوثائق على الإطلاق.بعد البحث في التعليمات البرمجية المصدر ActionController::Metal
, وأخيرا وجدت على هذا الخط.هذا صحيح, انها مجرد اختصار طلب.الدورة.
لتلخيص:
في وحدة تحكم...
- استخدام
request.env
أوenv
للحصول على الخام بيئة الكائن - استخدام
params
قراءة رف سلاسل الاستعلام بيانات من الرف تيار الإدخال.(E. g.Rack::Request#params
) - استخدام
session
للوصول إلى قيمةrack.session
في الرف البيئة
في الوسيطة...
- الوصول إلى خصائص البيئة بالطريقة المعتادة من خلال بيئة التجزئة
- الوصول القضبان الدورة من خلال
rack.session
المنشأة على البيئة تجزئة - قراءة params من خلال
Rack::Request#params
- تحديث params من خلال
Rack::Request#update_param
وRack::Request#delete_param
(كما جاء في المستنداتRack::Request#params
) - تحديث params في القضبان طريقة محددة باستخدام
ActionDispatch::Http::Parameters#params
من خلالActionDispatch::Request