[RUBY-ON-RAILS] 루비 레일에 : 어디 전역 상수를 정의하려면?
RUBY-ON-RAILS루비 레일에 : 어디 전역 상수를 정의하려면?
난 그냥 내 첫 번째 루비 레일에 웹 애플리케이션을 시작하는거야. 나는 다른 모델, 뷰, 컨트롤러의 무리를 가지고, 등등했습니다.
나는 내 모든 응용 프로그램에 적용 진정한 글로벌 상수의 정의를 고수 할 수있는 좋은 장소를 찾을 수 꿔. 특히, 내 모델의 논리에 모두 적용하고, 결정 내보기에 촬영. 나는 그들이 내 모든 모델 및 모든 내보기에 모두 사용할 수있어 이러한 정의를 넣어 어떤 DRY 장소를 찾을 수 없습니다.
특정의 예를 들자면, 나는 [, '흰색', '블루', '블랙', '녹색' '빨간색'] 일정한 색상은 =합니다. 이 모델과 뷰 모두에서 사방을 사용한다. 어디에서 그것이 접근 할 수 있다는, 그래서 그냥 한 곳에서 정의 할 수 있습니다?
나는 시도했다 :
모델에서와보기에서 모두 액세스 할 수 아무것도를 정의하는 단지 방법이 있나요? 나는 모델과 뷰가 분리되어야 알고 있지만 확실히 어떤 도메인에 그들은 같은 특정 영역의 지식을 참조 할 필요도있을 수 있습니다 의미?
해결법
-
==============================
1.모델이 상수에 대한 정말 "책임"이면 당신이 그들에게 충실해야한다고. 새 개체 인스턴스를 생성하지 않고 그들에 액세스 할 수 클래스 메소드를 생성 할 수 있습니다 :
모델이 상수에 대한 정말 "책임"이면 당신이 그들에게 충실해야한다고. 새 개체 인스턴스를 생성하지 않고 그들에 액세스 할 수 클래스 메소드를 생성 할 수 있습니다 :
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
참고 : 우리는 위의 상수를 정의 할 때, 종종 우리가 배열을 고정 할. 예컨대 의해 배열을 수정 후 (실수)으로부터 방지 다른 코드 새로운 요소를 추가. 객체가 동결되면, 더 이상 변경할 수 없습니다.
-
==============================
2.일부 옵션 :
일부 옵션 :
상수를 사용 :
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
그것이 진정한 글로벌 상수 인 경우, 당신은 또한 퍼팅 고려할 수있다 (하지만 이러한 성격의 전역 상수를 방지) 예를 들어, 설정 / 초기화 / my_constants.rb에서 최상위 상수.
-
==============================
3.레일 4.2로, 당신은 config.x 속성을 사용할 수 있습니다 :
레일 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에서, 당신은 config.x뿐만 아니라, 사용자 정의 구성을 위해 직접 구성 개체를 사용할 수 있습니다. 그러나, 단지 비 중첩 구성에 사용할 수 있습니다 :
# config/application.rb config.colours = %w[white blue black red green]
그것은 가능한 것으로 될 것입니다 :
Rails.configuration.colours # => ["white", "blue", "black", "red", "green"]
-
==============================
4.상수가 하나 개 이상의 클래스에 필요한 경우, 나는에 넣어 설정 / 초기화 / contant.rb 항상 모두 대문자로 (주 목록이 아래에 잘립니다).
상수가 하나 개 이상의 클래스에 필요한 경우, 나는에 넣어 설정 / 초기화 / 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
-
==============================
5.응용 프로그램 전체의 설정 및 글로벌 상수 나는 Settingslogic를 사용하는 것이 좋습니다. 이 설정은 YML 파일에 저장되며, 모델, 뷰와 컨트롤러에서 액세스 할 수 있습니다. 또한, 당신은 당신의 환경에 대해 다른 설정을 만들 수 있습니다 :
응용 프로그램 전체의 설정 및 글로벌 상수 나는 Settingslogic를 사용하는 것이 좋습니다. 이 설정은 YML 파일에 저장되며, 모델, 뷰와 컨트롤러에서 액세스 할 수 있습니다. 또한, 당신은 당신의 환경에 대해 다른 설정을 만들 수 있습니다 :
# 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
뷰에서 어딘가에 예를 들어, 또는 당신이 얻을 수있는 모델 (I 물건의 같은 종류의 도우미 방법을 선호한다)., 색상의 배열 Settings.colors.split (/ \ S /). 그것은 매우 유연합니다. 그리고 당신은 자전거를 발명 할 필요가 없습니다.
-
==============================
6.클래스 방법을 사용합니다 :
클래스 방법을 사용합니다 :
def self.colours ['white', 'red', 'black'] end
그런 다음 Model.colours는 배열을 반환합니다. 또는, 초기화를 만들고 네임 스페이스 충돌을 피하기 위해 모듈의 정수를 포장.
-
==============================
7.또 다른 옵션은, 당신이 한 곳에서 상수를 정의하려면 :
또 다른 옵션은, 당신이 한 곳에서 상수를 정의하려면 :
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
-
==============================
8.내부 설정 / 응용 프로그램은 일반적인 장소는 응용 프로그램 전체에 전역 상수를 넣어하는 것입니다.
내부 설정 / 응용 프로그램은 일반적인 장소는 응용 프로그램 전체에 전역 상수를 넣어하는 것입니다.
module MyApp FOO ||= ENV.fetch('FOO', nil) BAR ||= %w(one two three) class Application < Rails::Application config.foo_bar = :baz end end
-
==============================
9.나는 일반적으로 내 레일 프로그램에서 '조회'모델 / 테이블이 있고 상수를 사용합니다. 상수는 다른 환경에 따라 다를 수 위하여려고하는 경우에 매우 유용합니다. 당신이 그들을 확장 할 계획이있는 경우 또한, 당신이 나중에에 '노란색'를 추가하고 싶은 말은, 당신은 단순히 조회 테이블에 새 행을 추가 할 수 그것으로 할 수.
나는 일반적으로 내 레일 프로그램에서 '조회'모델 / 테이블이 있고 상수를 사용합니다. 상수는 다른 환경에 따라 다를 수 위하여려고하는 경우에 매우 유용합니다. 당신이 그들을 확장 할 계획이있는 경우 또한, 당신이 나중에에 '노란색'를 추가하고 싶은 말은, 당신은 단순히 조회 테이블에 새 행을 추가 할 수 그것으로 할 수.
이 테이블을 수정하려면 관리자 권한을 부여하는 경우, 그들은 유지 보수를 위해 당신에게 오지 않습니다. : 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
나는 그것을 미리 채울 수 seeds.rb 사용합니다.
Lookup.find_or_create_by_group_key_and_lookup_key_and_lookup_value!(group_key: 'development_COLORS', lookup_key: 'color1', lookup_value: 'red');
-
==============================
10.다음과 같이 내 응용 프로그램에서 나는 내 이니셜 폴더 상수를 생성 한, 한 곳에서 모든 일정하게 유지하려고 :
다음과 같이 내 응용 프로그램에서 나는 내 이니셜 폴더 상수를 생성 한, 한 곳에서 모든 일정하게 유지하려고 :
나는 일반적으로 이러한 파일의 모든 일정하게 유지.
상수 colors_constant.rb으로 폴더 아래에 귀하의 경우에 당신은 파일을 만들 수 있습니다
colors_constant.rb
서버를 다시 시작하는 것을 잊지 마세요
-
==============================
11.글로벌 변수 설정 / 초기화 디렉토리에 선언해야한다
글로벌 변수 설정 / 초기화 디렉토리에 선언해야한다
COLOURS = %w(white blue black red green)
-
==============================
12.당신의 상태에 따르면, 당신은 또한 몇 가지 환경 변수를 정의하고, 루비 코드에서 ENV [ '일부-VAR']를 통해 그것을 가져올 수 있습니다,이 솔루션은 당신을 위해 적합하지 않을 수 있습니다, 그러나 나는 다른 사람을 도움이 될 수 있기를 바랍니다.
당신의 상태에 따르면, 당신은 또한 몇 가지 환경 변수를 정의하고, 루비 코드에서 ENV [ '일부-VAR']를 통해 그것을 가져올 수 있습니다,이 솔루션은 당신을 위해 적합하지 않을 수 있습니다, 그러나 나는 다른 사람을 도움이 될 수 있기를 바랍니다.
예 : 다른 파일이 .development_env 만들 .production_env, .test_env 및 응용 프로그램 환경에 따라로드, 당신이 자동화이 세대 dotenv 레일을 확인할 수 있습니다.
from https://stackoverflow.com/questions/4110866/ruby-on-rails-where-to-define-global-constants by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 레일에 적정 SCSS 자산 구조 (0) | 2020.02.15 |
---|---|
[RUBY-ON-RAILS] 만들 대 새 레일 (0) | 2020.02.15 |
[RUBY-ON-RAILS] 변경 항목에 대한 마이그레이션을 레일 (0) | 2020.02.15 |
[RUBY-ON-RAILS] OSX의 독불 장군에 설치하지 "보석은 therubyracer -v '0.10.2'설치" (0) | 2020.02.15 |
[RUBY-ON-RAILS] 어떻게 고안과 확인 이메일을 설정합니까? (1) | 2020.02.15 |