كيف يمكنني الوصول إلى الرف البيئة من داخل القضبان ؟

StackOverflow https://stackoverflow.com/questions/848591

سؤال

لدي رف التطبيق الذي يبدو مثل هذا:

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 في الرف البيئة

في الوسيطة...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top