복붙노트

[RUBY-ON-RAILS] 루비 레일에 : 어디 전역 상수를 정의하려면?

RUBY-ON-RAILS

루비 레일에 : 어디 전역 상수를 정의하려면?

난 그냥 내 첫 번째 루비 레일에 웹 애플리케이션을 시작하는거야. 나는 다른 모델, 뷰, 컨트롤러의 무리를 가지고, 등등했습니다.

나는 내 모든 응용 프로그램에 적용 진정한 글로벌 상수의 정의를 고수 할 수있는 좋은 장소를 찾을 수 꿔. 특히, 내 모델의 논리에 모두 적용하고, 결정 내보기에 촬영. 나는 그들이 내 모든 모델 및 모든 내보기에 모두 사용할 수있어 이러한 정의를 넣어 어떤 DRY 장소를 찾을 수 없습니다.

특정의 예를 들자면, 나는 [, '흰색', '블루', '블랙', '녹색' '빨간색'] 일정한 색상은 =합니다. 이 모델과 뷰 모두에서 사방을 사용한다. 어디에서 그것이 접근 할 수 있다는, 그래서 그냥 한 곳에서 정의 할 수 있습니다?

나는 시도했다 :

모델에서와보기에서 모두 액세스 할 수 아무것도를 정의하는 단지 방법이 있나요? 나는 모델과 뷰가 분리되어야 알고 있지만 확실히 어떤 도메인에 그들은 같은 특정 영역의 지식을 참조 할 필요도있을 수 있습니다 의미?

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    6.클래스 방법을 사용합니다 :

    클래스 방법을 사용합니다 :

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

    그런 다음 Model.colours는 배열을 반환합니다. 또는, 초기화를 만들고 네임 스페이스 충돌을 피하기 위해 모듈의 정수를 포장.

  7. ==============================

    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. ==============================

    8.내부 설정 / 응용 프로그램은 일반적인 장소는 응용 프로그램 전체에 전역 상수를 넣어하는 것입니다.

    내부 설정 / 응용 프로그램은 일반적인 장소는 응용 프로그램 전체에 전역 상수를 넣어하는 것입니다.

    module MyApp
      FOO ||= ENV.fetch('FOO', nil)
      BAR ||= %w(one two three)
    
      class Application < Rails::Application
        config.foo_bar = :baz
      end
    end
    
  9. ==============================

    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. ==============================

    10.다음과 같이 내 응용 프로그램에서 나는 내 이니셜 폴더 상수를 생성 한, 한 곳에서 모든 일정하게 유지하려고 :

    다음과 같이 내 응용 프로그램에서 나는 내 이니셜 폴더 상수를 생성 한, 한 곳에서 모든 일정하게 유지하려고 :

    나는 일반적으로 이러한 파일의 모든 일정하게 유지.

    상수 colors_constant.rb으로 폴더 아래에 귀하의 경우에 당신은 파일을 만들 수 있습니다

    colors_constant.rb

    서버를 다시 시작하는 것을 잊지 마세요

  11. ==============================

    11.글로벌 변수 설정 / 초기화 디렉토리에 선언해야한다

    글로벌 변수 설정 / 초기화 디렉토리에 선언해야한다

    COLOURS = %w(white blue black red green)
    
  12. ==============================

    12.당신의 상태에 따르면, 당신은 또한 몇 가지 환경 변수를 정의하고, 루비 코드에서 ENV [ '일부-VAR']를 통해 그것을 가져올 수 있습니다,이 솔루션은 당신을 위해 적합하지 않을 수 있습니다, 그러나 나는 다른 사람을 도움이 될 수 있기를 바랍니다.

    당신의 상태에 따르면, 당신은 또한 몇 가지 환경 변수를 정의하고, 루비 코드에서 ENV [ '일부-VAR']를 통해 그것을 가져올 수 있습니다,이 솔루션은 당신을 위해 적합하지 않을 수 있습니다, 그러나 나는 다른 사람을 도움이 될 수 있기를 바랍니다.

    예 : 다른 파일이 .development_env 만들 .production_env, .test_env 및 응용 프로그램 환경에 따라로드, 당신이 자동화이 세대 dotenv 레일을 확인할 수 있습니다.

  13. from https://stackoverflow.com/questions/4110866/ruby-on-rails-where-to-define-global-constants by cc-by-sa and MIT license