ruby on rails - روبي أون ريلز: أين يمكن تحديد الثوابت العالمية؟




ruby-on-rails constants (8)

إذا كان نموذجك "مسؤولاً" عن الثوابت فعليك التمسك بها. يمكنك إنشاء طرق للفصول للوصول إليها دون إنشاء مثيل كائن جديد:

class Card < ActiveRecord::Base
  def self.colours
    ['white', 'blue']
  end
end

# accessible like this
Card.colours

بدلاً من ذلك ، يمكنك إنشاء متغيرات class و accessor. غير أن هذا لا يثبط ذلك لأن المتغيرات الطبقية قد تكون مثيرة للدهشة في الميراث وفي البيئات متعددة الخيوط.

class Card < ActiveRecord::Base
  @@colours = ['white', 'blue']
  cattr_reader :colours
end

# accessible the same as above

يسمح لك الخياران الموجودان أعلاه بتغيير الصفيف المرتجع عند كل استدعاء لطريقة accessor إذا لزم الأمر. إذا كان لديك true ثابت ثابت ، يمكنك أيضًا تعريفه على فئة النموذج:

class Card < ActiveRecord::Base
  COLOURS = ['white', 'blue'].freeze
end

# accessible as
Card::COLOURS

يمكنك أيضًا إنشاء ثوابت عمومية يمكن الوصول إليها من كل مكان في مُهيئ كما في المثال التالي. ربما يكون هذا هو أفضل مكان ، إذا كانت ألوانك عالمية بالفعل وتستخدم في أكثر من سياق نموذجي.

# put this into config/initializers/my_constants.rb
COLOURS = ['white', 'blue'].freeze

ملاحظة: عندما نحدد الثوابت أعلاه ، غالبًا ما نريد freeze المصفوفة. هذا يمنع التعليمات البرمجية الأخرى من وقت لاحق (بدون قصد) تعديل الصفيف عن طريق على سبيل المثال إضافة عنصر جديد. بمجرد أن يتم تجميد كائن ، لا يمكن تغييره بعد الآن.

أنا فقط بدأت مع أول روبي على القضبان webapp. لقد حصلت على مجموعة من النماذج المختلفة ، وجهات النظر ، وحدات التحكم ، وهلم جرا.

أنا أرغب في العثور على مكان جيد للتمسك بتعريفات الثوابت العالمية الحقيقية ، التي تنطبق عبر تطبيقي بالكامل. على وجه الخصوص ، فهي تنطبق على منطق نماذجي ، وفي القرارات المتخذة في وجهات نظري. لا أستطيع العثور على أي مكان جاف لوضع هذه التعريفات حيث تكون متاحة لكل طرازاتي وكذلك في جميع وجهات نظري.

لنأخذ مثالًا محددًا ، أريد الحصول على COLOURS = ['white', 'blue', 'black', 'red', 'green'] ثابت COLOURS = ['white', 'blue', 'black', 'red', 'green'] . يتم استخدام هذا في كل مكان ، في كل من النموذجين وجهات النظر. أين يمكنني تعريفه في مكان واحد فقط بحيث يمكن الوصول إليه؟

ما جربت:

  • متغيرات الطبقة الثابتة في ملف model.rb الذي ترتبط به أكثر ، مثل @@COLOURS = [...] . ولكن لم أتمكن من العثور على طريقة عاقلة لتحديد ذلك حتى أتمكن من الكتابة في وجهة نظري Card.COLOURS بدلا من شيء kludgy مثل Card.first.COLOURS .
  • طريقة على النموذج ، شيء من هذا القبيل def colours ['white',...] end - نفس المشكلة.
  • طريقة في application_helper.rb - هذا ما أفعله حتى الآن ، ولكن يمكن الوصول إلى المساعدين فقط في وجهات النظر ، وليس في النماذج
  • أعتقد أنني ربما جربت شيئًا ما في application.rb أو environment.rb ، لكن لا يبدو ذلك صحيحًا حقًا (ولا يبدو أنها تعمل أيضًا)

هل توجد طريقة لتعريف أي شيء يمكن الوصول إليه من النماذج ومن المشاهدات؟ أعني ، أعرف أن النماذج والآراء يجب أن تكون منفصلة ، ولكن بالتأكيد في بعض النطاقات ستكون هناك أوقات يحتاجون فيها للإشارة إلى نفس المعرفة الخاصة بالنطاق؟


إذا كان هناك حاجة إلى ثابت في أكثر من فصل واحد ، أضعه في config / initializers / contant.rb دائمًا في كافة الأحرف الاستهلالية (قائمة الحالات أدناه مبتورة).

STATES = ['AK', 'AL', ... 'WI', 'WV', 'WY']

وهي متوفرة من خلال التطبيق ما عدا في نموذج رمز على النحو التالي:

    <%= form.label :states, %>
    <%= form.select :states, STATES, {} %>

لاستخدام الثابت في نموذج ، استخدم attr_accessor لجعل الثابت متاحًا.

class Customer < ActiveRecord::Base
    attr_accessor :STATES

    validates :state, inclusion: {in: STATES, message: "-- choose a State from the drop down list."}
end

اعتبارًا من Rails 5.0 ، يمكنك استخدام كائن configuration مباشرة للتكوين المخصص :

في config/application.rb (أو config/custom.rb إذا كنت تفضل)

config.colours = %w(white blue black red green)

سوف تكون متاحة على النحو التالي:

Rails.configuration.colours # => ["white", "blue", "black", "red", "green"]

ملاحظة: للإصدار 4.2 ، تحتاج إلى استخدام خاصية config.x :

config.x.colours = %w(white blue black red green)

والتي ستكون متاحة على النحو التالي:

Rails.configuration.x.colours # => ["white", "blue", "black", "red", "green"]

بعض الخيارات:

باستخدام ثابت:

class Card
  COLOURS = ['white', 'blue', 'black', 'red', 'green', 'yellow'].freeze
end

كسول تحميل باستخدام متغير مثيل الصف:

class Card
  def self.colours
    @colours ||= ['white', 'blue', 'black', 'red', 'green', 'yellow'].freeze
  end
end

إذا كان ثابتًا عالميًا حقيقيًا ( تجنب الثوابت العالمية من هذه الطبيعة ) ، يمكنك أيضًا التفكير في وضع ثابت عالي المستوى في config/initializers/my_constants.rb على سبيل المثال.


عادةً ما يكون لدي نموذج / جدول بحث في برنامج القضبان الخاص بي واستخدمه للثوابت. من المفيد جدا إذا كانت الثوابت ستكون مختلفة للبيئات المختلفة. بالإضافة إلى ذلك ، إذا كان لديك خطة لتوسيعها ، فقل أنك تريد إضافة "أصفر" في تاريخ لاحق ، يمكنك ببساطة إضافة صف جديد إلى جدول البحث والقيام به.

إذا أعطيت أذونات المسؤول لتعديل هذا الجدول ، فلن يأتون إليك للصيانة. :) جافة.

إليك كيفية ظهور رمز الترحيل الخاص بي:

class CreateLookups < ActiveRecord::Migration
  def change
    create_table :lookups do |t|
      t.string :group_key
      t.string :lookup_key
      t.string :lookup_value
      t.timestamps
    end
  end
end

أنا استخدم seed.rb لملء ما قبل ذلك.

Lookup.find_or_create_by_group_key_and_lookup_key_and_lookup_value!(group_key: 'development_COLORS', lookup_key: 'color1', lookup_value: 'red');

للإعدادات على مستوى التطبيق وللثوابت العالمية ، أوصي باستخدام Settingslogic . يتم تخزين هذه الإعدادات في ملف YML ويمكن الوصول إليها من الموديلات وطرق العرض ووحدات التحكم. أكثر من ذلك ... يمكنك إنشاء إعدادات مختلفة لجميع البيئات الخاصة بك:

  # app/config/application.yml
  defaults: &defaults
    cool:
      saweet: nested settings
    neat_setting: 24
    awesome_setting: <%= "Did you know 5 + 5 = #{5 + 5}?" %>

    colors: "white blue black red green"

  development:
    <<: *defaults
    neat_setting: 800

  test:
    <<: *defaults

  production:
    <<: *defaults

في مكان ما في العرض (أفضّل أساليب المساعد لمثل هذا النوع من الأشياء) أو في نموذج يمكنك الحصول عليه ، على سبيل المثال ، مجموعة من الألوان Settings.colors.split(/\s/) . انها مرنة جدا. ولا تحتاج إلى ابتكار دراجة.


وفقًا لحالتك ، يمكنك أيضًا تحديد بعض المتغيرات البيئية ، وجلبها عبر ENV['some-var'] في رمز روبي ، وهذا الحل قد لا يناسبك ، ولكن أتمنى أن يساعد ذلك الآخرين.

على سبيل المثال: يمكنك إنشاء ملفات مختلفة .development_env ، .development_env ، .test_env وتحميلها وفقًا لبيئات تطبيقك ، تحقق من هذا dotenv-rails الذي dotenv-rails تلقائيًا.


يجب أن يعلن المتغير الشامل في دليل config/initializers

COLOURS = %w(white blue black red green)




global