كيف تجد مساحة الاسم/اسم الوحدة النمطية برمجيا في روبي على القضبان ؟

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

  •  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

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