سؤال

تم تبسيط الأسماء والكائنات من أجل الوضوح. المفهوم الأساسي يبقى كما هو.

لدي ثلاث وحدات تحكم: dog, cat, ، و horse. ترث جميع وحدات التحكم هذه من وحدة التحكم animal. في وحدة التحكم animal, ، لديّ قبل تصفية يقوم بإصدار مستخدم على هذا النحو:

before_filter :authenticate

def authenticate
  authenticate_or_request_with_http_basic do |name, password|
    name == "foo" && password == "bar"
  end
end

في ال show عمل dog, ، أحتاج إلى الوصول المفتوح إلى جميع المستخدمين (تخطي المصادقة).

إذا كنت سأكتب المصادقة بشكل منفصل ل dog, ، يمكنني أن أفعل شيئًا كهذا:

before_filter :authenticate, :except => :show

لكن منذ dog يرث من animal, ، ليس لدي إمكانية الوصول إلى الإجراءات الخاصة بالوحدة. مضيفا :except => :show في ال animal لن تتخطى وحدة التحكم المصادقة فقط ل show عمل dog, ، ولكن أيضا ذلك من cat و horse. هذا السلوك غير مرغوب فيه.

كيف يمكنني تخطي المصادقة فقط ل show عمل dog بينما لا تزال ترث من animal?

هل كانت مفيدة؟

المحلول

class Dog < Animal
  skip_before_filter :authenticate, :only => :show
end

يرى ActionController :: Filters :: ClassMethods لمزيد من المعلومات حول المرشحات والميراث.

نصائح أخرى

الإجابات المقدمة هما نصف اليمين. من أجل تجنب جعل جميع تصرفات الكلب مفتوحة ، تحتاج إلى تأهيل skip_before_filter لتطبيق فقط على إجراء "العرض" على النحو التالي:

class Dog < Animal
  skip_before_filter :authenticate, :only => :show
end

لهذا يمكنك استخدام skip_before_filter

تم شرحه في قضبان API

في مثالك dogفقط يجب أن تحتوي على

skip_before_filter :authenticate

مجرد تحديث صغير باستخدام Rails 4 ، إنه الآن skip_before_action :authenticate, :only => :show ويجب الآن استخدام ref_filters before_action في حين أن.

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