রেল অন রুবেল: বিশ্বব্যাপী ধ্রুবককে কোথায় সংজ্ঞায়িত করবেন?


213

আমি সবেমাত্র আমার প্রথম রুবি সাথে রেলস ওয়েবপ্যাপে শুরু করছি। আমি বিভিন্ন মডেল, ভিউ, কন্ট্রোলার এবং আরও অনেক কিছু পেয়েছি।

আমি সত্যিকারের গ্লোবাল ধ্রুবকের সংজ্ঞাগুলির জন্য একটি ভাল জায়গা খুঁজে পেতে চাই যা আমার পুরো অ্যাপ্লিকেশন জুড়ে প্রযোজ্য। বিশেষত, তারা আমার মডেলগুলির যুক্তি এবং আমার মতামত নেওয়া সিদ্ধান্তে উভয়ই প্রয়োগ করে। এই সংজ্ঞাগুলি রাখার জন্য আমি কোনও ডিআরওয়াই স্থান খুঁজে পাই না যেখানে তারা আমার সমস্ত মডেল এবং আমার সমস্ত দর্শনগুলিতে উপলব্ধ।

একটি নির্দিষ্ট উদাহরণ নিতে, আমি একটি ধ্রুবক চাই COLOURS = ['white', 'blue', 'black', 'red', 'green']। মডেল এবং দর্শন উভয় ক্ষেত্রে এটি পুরো জায়গা জুড়ে ব্যবহৃত হয়। আমি যেখানে এটি কেবল একটি জায়গায় সংজ্ঞা দিতে পারি যাতে এটি অ্যাক্সেসযোগ্য হয়?

আমি যা চেষ্টা করেছি:

  • মডেল.আরবি ফাইলে কনস্ট্যান্ট ক্লাস ভেরিয়েবলগুলি যার সাথে তারা সর্বাধিক যুক্ত, যেমন @@COLOURS = [...]। তবে আমি এটি সংজ্ঞায়িত করার মতো বুদ্ধিমান উপায় খুঁজে পাইনি যাতে আমি আমার Card.COLOURSমতামতটিতে ক্লডগির মতো কিছু না করে লিখতে পারি Card.first.COLOURS
  • মডেলের একটি পদ্ধতি, এর মতো কিছু def colours ['white',...] end- একই সমস্যা।
  • অ্যাপ্লিকেশন_হেল্পার.আরবিতে একটি পদ্ধতি - এটি আমি এখন অবধি যা করছি তবে সাহায্যকারীরা কেবলমাত্র দর্শনে অ্যাক্সেসযোগ্য, মডেলগুলিতে নয়
  • আমি মনে করি আমি অ্যাপ্লিকেশন.আরবি বা এনভায়রনমেন্ট.আরবিতে কিছু চেষ্টা করে দেখেছি, তবে এগুলি সত্যই সঠিক বলে মনে হচ্ছে না (এবং তারা কাজ করে বলে মনে হয় না)

মডেল এবং ভিউ উভয়ই অ্যাক্সেসযোগ্য হতে পারে এমন কোনও সংজ্ঞা দেওয়ার কি উপায় নেই? আমার অর্থ, আমি জানি মডেল এবং দৃষ্টিভঙ্গি পৃথক হওয়া উচিত, তবে অবশ্যই কিছু ডোমেনে একই ডোমেন-নির্দিষ্ট জ্ঞানটি উল্লেখ করার সময় থাকতে হবে?



আমি প্রশংসা করি যে এটি সত্যিই দেরি হয়ে গেছে, তবে অন্যান্য পাঠকদের জন্য আমি অবাক হয়েছি কেন আপনি কেবল তাদের মডেলটিতে এগুলি সংজ্ঞায়িত করেন নি এবং আপনার নিয়ামকগুলিকে আপনার মতামতে পাস করার জন্য তাদের ব্যবহার করেন না। নিয়ামক / দর্শন এবং মডেল / দৃশ্যের মধ্যে নির্ভরতা তৈরির পরিবর্তে - এইভাবে আপনার উদ্বেগের একটি পরিষ্কার বিচ্ছিন্নতা থাকতে হবে।
টম টম

2
@ টমটম: এই ধ্রুবকগুলিকে প্রতিটি ভিউ এবং সহায়তার জন্য প্রয়োজনীয় যা তাদের প্রয়োজন? অন্য কথায়, নিয়ামককে সচেতন করে তুলুন যে কোন দৃশ্যের জন্য কোন মতামত প্রয়োজন? এটি এমভিসির লঙ্ঘনের মতো শোনাচ্ছে।
অ্যালেক্সসি

উত্তর:


229

যদি আপনার মডেলটি ধ্রুবকগুলির জন্য সত্যই "দায়বদ্ধ" থাকে তবে আপনার সেগুলি সেখানে আটকে রাখা উচিত। কোনও নতুন অবজেক্টের উদাহরণ তৈরি না করে এগুলি অ্যাক্সেসের জন্য আপনি ক্লাস পদ্ধতিগুলি তৈরি করতে পারেন:

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

# accessible like this
Card.colours

বিকল্পভাবে, আপনি ক্লাস ভেরিয়েবল এবং একটি অ্যাক্সেসর তৈরি করতে পারেন। এটি অবশ্য নিরুৎসাহিত করা হয়েছে কারণ শ্রেণি ভেরিয়েবলগুলি উত্তরাধিকার এবং একাধিক থ্রেড পরিবেশে অবাক করে দেওয়ার মতো কাজ করতে পারে।

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

# accessible the same as above

উপরোক্ত দুটি বিকল্প আপনাকে প্রয়োজন হলে অ্যাক্সেসর পদ্ধতির প্রতিটি অনুরোধে ফেরত অ্যারে পরিবর্তন করতে দেয়। যদি আপনার সত্যিকারের অপরিবর্তনীয় ধ্রুবক থাকে তবে আপনি এটি মডেল শ্রেণিতেও সংজ্ঞায়িত করতে পারেন:

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অ্যারেতে চাই। এটি অন্য কোডগুলি পরে (অজান্তেই) অ্যারে পরিবর্তন করে যেমন একটি নতুন উপাদান যুক্ত করে বাধা দেয়। কোনও জিনিস হিমশীতল হয়ে গেলে, এটি আর পরিবর্তন করা যায় না।


1
আপনাকে অনেক ধন্যবাদ. দেখে মনে হচ্ছে আমি ক্লাসের পদ্ধতিগুলি সংজ্ঞায়িত করতে রুবি ক্লাস-ফু অনুপস্থিত। তবে আমি আসলে এই ক্ষেত্রে প্রারম্ভিক বিকল্পটি পছন্দ করি কারণ রঙগুলি একাধিক মডেল এবং দর্শনগুলিতে ব্যবহৃত হয়। অনেক ধন্যবাদ!
অ্যালেক্সস

21
তাহলে যাচ্ছে config/initializers/my_constants.rb: রুট, সার্ভার পুনরায় আরম্ভ মনে রাখবেনtouch tmp/restart.txt
user664833

4
def self.coloursউদাহরণস্বরূপ আদর্শ নয়। যতবার আপনি কল করবেন def self.colours, অ্যারের একটি নতুন উদাহরণ ফিরে আসবে#freezeএই ক্ষেত্রে সাহায্য করবে না। সেরা অনুশীলন হ'ল এটিকে রুবি ধ্রুবক হিসাবে ঘোষণা করা, এক্ষেত্রে আপনি সর্বদা একই জিনিসটি ফিরে পাবেন।
জাবাবা

@ জাবা যদি কোনও একটি অ্যারের বরাদ্দ করা আপনার অ্যাপ্লিকেশনটির জন্য একটি উল্লেখযোগ্য তাত্পর্য তৈরি করে, আপনি সম্ভবত প্রথমে রুবিকে ব্যবহার করবেন না ... এটি বলেছে যে, একটি পদ্ধতি ব্যবহার করে এবং প্রতিবার সম্পূর্ণ নতুন অ্যারে ফিরিয়ে দেওয়া একটি দম্পতি থাকতে পারে সুবিধার সুবিধাগুলি: (১) আপনি রুবিতে আপনার শ্রেণির সীমানায় অপরিবর্তনীয় বস্তুর প্রতি যে নিকটতম জিনিসটি পেতে পারেন এবং (২) আপনি অন্তর্নিহিত রাষ্ট্রের উপর ভিত্তি করে রিটার্ন মানটি মানিয়ে নেওয়ার সম্ভাবনা সহ আপনার শ্রেণিতে অভিন্ন ইন্টারফেস রাখেন (যেমন: ইন্টারফেস পরিবর্তন না করে ডিবি থেকে রঙগুলি পড়া)।
হোলগার ঠিক

@ হোলজার জাস্ট, আপনার লক্ষ্যগুলির মধ্যে কমপক্ষে একটি এখনও একটি ধ্রুবক ব্যবহার করে অর্জন করা যেতে পারে: class Card; COLOURS = ['white', 'blue'].freeze; def self.colours; COLOURS; end; endএটি বলেছে যে কোনও ভাষায় অ্যারের বরাদ্দ করা সম্ভাব্য সমস্যা হতে পারে; একটির জন্য, এটি কোনও (ভাল) কারণে মেমরি ব্যবহার করছে। যদি কোনও ডিবি থেকে লোড হচ্ছে, এবং মানটি ক্যাশে করতে চাইলে, একটি শ্রেণীর উদাহরণ পরিবর্তনশীলও ব্যবহার করতে পারে, যা def self.coloursপদ্ধতিটি ব্যবহার করে অলস হতে পারে । অপরিবর্তনীয় দিক সম্পর্কে যদিও সম্মত।
জাবাবা

70

কিছু বিকল্প:

একটি ধ্রুবক ব্যবহার:

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উদাহরণস্বরূপ শীর্ষ স্তরের ধ্রুবক স্থাপন বিবেচনা করতে পারেন ।


1
হেহ। সুষ্ঠু মন্তব্য - মেমরি থেকে টাইপ করার সময় সিনট্যাক্স ত্রুটি আমার উদাহরণ :) টিপটির জন্য ধন্যবাদ!
অ্যালেক্সস

2
তারপরে extendক্লাসে মডিউল যাতে এটি উপলব্ধ থাকে Card.COLOURS
undefinedvariable

এটি extendআমার জন্য কাজ করে না যখন । ব্যবহার করার সময় includeআমি Card::COLOURS
এগুলি

আপনার অবশ্যই এটির অধীনে রাখা উচিত নয় /models। আপনি ইনিশিয়ালাইজার তৈরি করলে এটি অনেক বেশি ভাল better
linkyndy

@ লিঙ্কইন্ডি আমি বলব ঠিক আছে এটির নিচে রাখা ঠিক আছে /models, তবে কেবল যদি এটির কোনও মডিউল থাকে তবে যেমন module Constants; COLOURS = ...; endএকটি ফাইল বলা হয় models/constants.rb
কেলভিন

57

4.2 কারাগার হিসাবে, আপনি config.xসম্পত্তিটি ব্যবহার করতে পারেন :

# config/application.rb (or config/custom.rb if you prefer)
config.x.colours.options = %w[white blue black red green]
config.x.colours.default = 'white'

যা হিসাবে উপলব্ধ হবে:

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

কাস্টম কনফিগার লোড করার আরেকটি পদ্ধতি:

# config/colours.yml
default: &default
  options:
    - white
    - blue
    - black
    - red
    - green
  default: white
development:
  *default
production:
  *default
# config/application.rb
config.colours = config_for(:colours)
Rails.configuration.colours
# => {"options"=>["white", "blue", "black", "red", "green"], "default"=>"white"}
Rails.configuration.colours['default']
# => "white"

5 এবং 6 রেলগুলিতে আপনি এছাড়াও configurationসরাসরি কাস্টম কনফিগারেশনের জন্য অবজেক্টটি ব্যবহার করতে পারেন config.x। তবে এটি কেবলমাত্র নেস্টেড কনফিগারেশনের জন্য ব্যবহার করা যেতে পারে:

# config/application.rb
config.colours = %w[white blue black red green]

এটি হিসাবে উপলব্ধ হবে:

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

2
আমি Rails.configuration.coloursসবচেয়ে বেশি পছন্দ করি (যদিও আমি ইচ্ছা করি এটি এত দিন না ছিল)
টম রসি

@ টমরোসি আমি সম্মত, যেমন configহিসাবে ভাল configuration। আমরা কোনও সময়ে শর্টকাট পেতে আশা করতে পারি :)
হালিল Özgür

একাধিক নিয়ামক জুড়ে ভাগ করার জন্য ধ্রুবকগুলি সংজ্ঞায়িত করার জন্য এটি কি এখনও রেলপথের সর্বোত্তম উপায়? উত্তর করার জন্য ধন্যবাদ!
ক্রশালোট

@ ক্র্যাশলোট এটি এখনও ডক্সে তালিকাভুক্ত। "সেরা"? এটা নির্ভর করে. এটি তাদের সাধারণ পূর্বপুরুষের মধ্যে থাকতে পারে। বা ApplicationControllerযদি এর মধ্যে আর কিছু না থাকে। যদি ধ্রুবকগুলি সরাসরি কন্ট্রোলারের সাথে সম্পর্কিত না হয় তবে আমি এখনও একটি গ্লোবাল কনফিগারেশন ইত্যাদি বিবেচনা করব
হালিল hourszgür

উত্তর দেওয়ার জন্য ধন্যবাদ @ হালিলাজগের আপনি একটি সাধারণ পূর্বপুরুষের মধ্যে ধ্রুবককে কীভাবে সংজ্ঞায়িত করেন?
ক্র্যাশলোট

18

যদি একাধিক শ্রেণিতে ধ্রুবক প্রয়োজন হয় তবে আমি এটিকে সবসময় ক্যাপগুলিতে কনফিগার / আরম্ভকারী / কনট্যান্ট.আরবিতে রাখি (নীচের রাজ্যের তালিকাটি কাটা হয়েছে)।

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

1
সুন্দর, config/initializers/constants.rbসম্ভবত এটি আরও ভাল পছন্দ হতে পারে
Adit সাক্সেনা

আমি এটিও ব্যবহার করেছি, তবে সম্প্রতি বিষয়টি নিয়ে এসেছিল যে এই ধ্রুবকরা প্রয়োগে অ্যাক্সেসযোগ্য নয়
জিয়া উল রেহমান মুঘল

আমার ধ্রুবকগুলি কাজ করছিল তবে কোনও কারণে বন্ধ হয়ে গেছে (যেহেতু আমার ফাইলটি আরম্ভকারীদের বাইরে চলে গেল)। এই উত্তরটি যাচাই করার পরে আমি নিবিড়ভাবে দেখেছি এবং সেগুলি আবার সরিয়ে নিয়েছি এবং এখন কাজ করছি। ধন্যবাদ
মুহাম্মদ নাসির শামশাদ

আমার মনে হয় না অ্যাটর_অ্যাকসেসরের দরকার। আপনি কি কোনও বিশেষ রেল সংস্করণ সম্পর্কে কথা বলছেন?
ময়ূরেশ শ্রীবাস্তব

16

অ্যাপ্লিকেশন-চওড়া সেটিংস্ ও বৈশ্বিক ধ্রুবক জন্য আমি ব্যবহার সুপারিশ Settingslogic । এই সেটিংসটি ওয়াইএমএল ফাইলে সংরক্ষিত রয়েছে এবং মডেল, দর্শন এবং নিয়ন্ত্রণকারীদের থেকে অ্যাক্সেস করা যেতে পারে। তদতিরিক্ত, আপনি আপনার সমস্ত পরিবেশের জন্য বিভিন্ন সেটিংস তৈরি করতে পারেন:

  # app/config/application.yml
  defaults: &defaults
    cool:
      sweet: 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

কোথাও ভিউতে (আমি এ জাতীয় ধরণের জিনিসগুলির জন্য সহায়ক পদ্ধতির পছন্দ করি) বা কোনও মডেল হিসাবে আপনি পেতে পারেন, প্রাক্তন জন্য colors রঙিন অ্যারে Settings.colors.split(/\s/)। এটা খুব নমনীয়। এবং আপনার বাইক আবিষ্কার করার দরকার নেই।


7

একটি শ্রেণিবদ্ধ পদ্ধতি ব্যবহার করুন:

def self.colours
  ['white', 'red', 'black']
end

তারপরে Model.coloursসেই অ্যারে ফিরে আসবে। বিকল্পভাবে, একটি প্রাথমিককরণ তৈরি করুন এবং নাম স্থানের বিরোধগুলি এড়ানোর জন্য একটি মডিউলটিতে ধ্রুবকগুলি মোড়ানো করুন।


4

সমস্ত স্থির স্থানে এক জায়গায় রাখার চেষ্টা করুন, আমার আবেদনে আমি ইনিশিয়ালাইজারগুলির ভিতরে নিম্নরূপ ধ্রুবক ফোল্ডার তৈরি করেছি:

এখানে চিত্র বর্ণনা লিখুন

এবং আমি সাধারণত এই ফাইলগুলিতে সমস্ত ধ্রুবক রাখি।

আপনার ক্ষেত্রে আপনি কনস্ট্যান্ট ফোল্ডার হিসাবে ফাইল তৈরি করতে পারেন colors_constant.rb

colors_constant.rb

এখানে চিত্র বর্ণনা লিখুন

সার্ভার পুনরায় চালু করতে ভুলবেন না


1
এটি এখানে আমি খুঁজে পেয়েছি সেরা উত্তর। ধন্যবাদ.
প্রেস্টন

3

অন্য বিকল্প, যদি আপনি নিজের স্থির অবস্থানগুলি এক জায়গায় সংজ্ঞায়িত করতে চান:

module DSL
  module Constants
    MY_CONSTANT = 1
  end
end

তবে এখনও তাদের পুরোপুরি যোগ্যতাসম্পন্ন উপায়ে অ্যাক্সেস না করে বিশ্বব্যাপী দৃশ্যমান করুন:

DSL::Constants::MY_CONSTANT # => 1
MY_CONSTANT # => NameError: uninitialized constant MY_CONSTANT
Object.instance_eval { include DSL::Constants }
MY_CONSTANT # => 1

3

অ্যাপ্লিকেশন-ব্যাপী বিশ্বব্যাপী ধ্রুবকগুলি রাখার একটি সাধারণ জায়গা ভিতরে config/application

module MyApp
  FOO ||= ENV.fetch('FOO', nil)
  BAR ||= %w(one two three)

  class Application < Rails::Application
    config.foo_bar = :baz
  end
end

2

আমার রেল প্রোগ্রামে আমার সাধারণত একটি 'লুকিং' মডেল / টেবিল থাকে এবং ধ্রুবকগুলির জন্য এটি ব্যবহার করি। কনস্ট্যান্টগুলি বিভিন্ন পরিবেশের জন্য পৃথক হতে থাকলে এটি খুব কার্যকর। এগুলি ছাড়াও, যদি আপনার সেগুলি বাড়ানোর পরিকল্পনা থাকে তবে বলুন যে আপনি কোনও পরবর্তী তারিখে 'হলুদ' যুক্ত করতে চান, আপনি কেবল অনুসন্ধান টেবিলে একটি নতুন সারি যুক্ত করতে পারেন এবং এটি দিয়ে সম্পন্ন করতে পারেন।

আপনি যদি এই টেবিলটি সংশোধন করার জন্য প্রশাসকের অনুমতি দেন তবে সেগুলি রক্ষণাবেক্ষণের জন্য আপনার কাছে আসবে না। :) DRY।

এখানে আমার মাইগ্রেশন কোডটি কেমন দেখাচ্ছে:

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

আমি এটি প্রাক-জনিত করতে বীজ.আরবি ব্যবহার করি।

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

1

গ্লোবাল ভেরিয়েবল config/initializersডিরেক্টরিতে ঘোষণা করা উচিত

COLOURS = %w(white blue black red green)

ধন্যবাদ! অন্যরা ইতিমধ্যে এটি উল্লেখ করেছেন। এটি হোলারের জবাবের শেষ পংক্তি, এবং জাবাবাও এই কৌশলটির উল্লেখ করেছেন, যদিও জবাবা এর বিরুদ্ধে সতর্ক করে দিয়েছে।
অ্যালেক্সসি

0

আপনার শর্ত অনুযায়ী আপনি কিছু পরিবেশগত পরিবর্তনশীলও সংজ্ঞায়িত করতে পারেন এবং এটি ENV['some-var']রুবি কোডের মাধ্যমে আনতে পারেন , এই সমাধানটি আপনার পক্ষে উপযুক্ত নাও হতে পারে তবে আমি আশা করি এটি অন্যকে সহায়তা করতে পারে।

উদাহরণ: আপনি বিভিন্ন ফাইল তৈরি করতে পারেন .development_env, .production_env, .test_envপরীক্ষা এই জনক, এবং আপনার আবেদন পরিবেশের অনুযায়ী এটি লোড dotenv-পাগল যা আপনার জন্য এই স্বয়ংক্রিয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.