كيف تجد مساحة الاسم/اسم الوحدة النمطية برمجيا في روبي على القضبان ؟
-
02-07-2019 - |
سؤال
كيف يمكنني العثور على اسم مساحة الاسم أو وحدة 'فو' في تصفية أدناه ؟
class ApplicationController < ActionController::Base
def get_module_name
@module_name = ???
end
end
class Foo::BarController < ApplicationController
before_filter :get_module_name
end
المحلول
أيا من هذه الحلول النظر المستمر مع عدة الوالدين وحدات.على سبيل المثال:
A::B::C
كما من القضبان 3.2.× يمكنك ببساطة:
"A::B::C".deconstantize #=> "A::B"
كما من القضبان 3.1.x يمكنك:
constant_name = "A::B::C"
constant_name.gsub( "::#{constant_name.demodulize}", '' )
لأن هذا هو #demodulize هو عكس #deconstantize:
"A::B::C".demodulize #=> "C"
إذا كنت حقا بحاجة إلى القيام بذلك يدويا, جرب هذا:
constant_name = "A::B::C"
constant_name.split( '::' )[0,constant_name.split( '::' ).length-1]
نصائح أخرى
هذا ينبغي أن نفعل ذلك:
def get_module_name
@module_name = self.class.to_s.split("::").first
end
للحالات البسيطة التي يمكنك استخدامها :
self.class.parent
هذا من شأنه أن يعمل إذا كان جهاز تحكم كان اسم الوحدة النمطية ، ولكن سيعود اسم المراقب لو أنه لم يكن.
class ApplicationController < ActionController::Base
def get_module_name
@module_name = self.class.name.split("::").first
end
end
ومع ذلك ، إذا أردنا تغيير هذا الأمر قليلا:
class ApplicatioNController < ActionController::Base
def get_module_name
my_class_name = self.class.name
if my_class_name.index("::").nil? then
@module_name = nil
else
@module_name = my_class_name.split("::").first
end
end
end
يمكنك تحديد ما إذا كانت فئة لديها اسم الوحدة النمطية أو لا والعودة شيء آخر غير اسم الفئة التي يمكنك اختبار.
أعرف أن هذا هو الموضوع القديم, ولكن لقد عدت للتو عبر ضرورة أن يكون مستقلا الملاحة اعتمادا على مساحة من وحدة تحكم.الحل خطرت لي كان هذا في تطبيق تخطيط:
<%= render "#{controller.class.name[/^(\w*)::\w*$/, 1].try(:downcase)}/nav" %>
والتي تبدو معقدة بعض الشيء ولكن في الأساس لا ما يلي - فإنه يأخذ تحكم اسم الفئة ، التي من شأنها أن تكون على سبيل المثال "الناس" غير namespaced تحكم "المشرف::مستخدمي" عن namespaced واحد.باستخدام [] سلسلة الطريقة مع التعبير العادي أن يعود أي شيء من قبل اثنين من نقطتين, أو لا شيء إذا لم يكن هناك شيء.ومن ثم التغييرات التي لخفض حالة ("محاولة" هناك في حالة عدم وجود مساحة و النيل هو عاد).هذا ثم يترك لنا أي مساحة أو لا شيء.ثم ببساطة يجعل الجزئي مع أو بدون مساحة الاسم على سبيل المثال لا مساحة:
app/views/_nav.html.erb
أو في المشرف مساحة:
app/views/admin/_nav.html.erb
بالطبع هذه جزئيات يكون في الوجود لكل مساحة وإلا خطأ يحدث.الآن الملاحة لكل مساحة الاسم سوف تظهر لكل وحدة تحكم دون الحاجة إلى تغيير أي تحكم أو عرض.
my_class.name.underscore.split('/').slice(0..-2)
أو
my_class.name.split('::').slice(0..-2)
لا أعتقد أن هناك نظافة و أنا رأيت هذا في مكان آخر
class ApplicationController < ActionController::Base
def get_module_name
@module_name = self.class.name.split("::").first
end
end
أوصي gsub
بدلا من split
.انها أكثر فعالية split
بالنظر إلى أن كنت لا تحتاج إلى أي اسم الوحدة النمطية.
class ApplicationController < ActionController::Base
def get_module_name
@module_name = self.class.to_s.gsub(/::.*/, '')
end
end
مع العديد من وحدات فرعية:
module ApplicationHelper
def namespace
controller.class.name.gsub(/(::)?\w+Controller$/, '')
end
end
على سبيل المثال: Foo::Bar::BazController
=> Foo::Bar