3

내 Rails 앱 위에는 최신 핫 딜, 예정된 다운 타임 알림 등의 텍스트가 표시된 막대가 있습니다. 그것은 기본적으로 모든 요청에 ​​액세스해야하는 종류의 정보로 구성되며 때때로 업데이트 될 수 있습니다. 이것을 달성하는 가장 좋은 방법은 무엇입니까?Rails의 영구 변수

내가하고 싶은 것은 영구적 인 전역 변수 (컨트롤러에서 액세스 할 수 있음)입니다.

  • 매우 드물게 업데이트되므로 업데이트 후 얼마 동안 작업자간에 불일치가 발생해도 아무런 문제가 없습니다.
  • 반면에 서버 장애가 발생하면 영구적이어야합니다 (정기 백업이면 충분합니다).
  • 정말 자주 액세스 될 것이므로되도록 빨리 메모리에 저장해야합니다.
  • 또한 종류 중 하나 일 뿐이므로 전용 데이터베이스 모델로 앱을 부 풀리지 않는 것이 좋습니다.

예를 들어, Node.js에서와 같이 쉽게 들릴 수 있지만 레일스에서이를 달성하는 단일 방법을 찾을 수 없습니다. 내가 무엇을하여야한다? 그들은 영감있는 동안

EDIT 답변에 대한

덕분에 지금까지하지만, 나는 그들이 모두 놓치고있어 하나 개의 핵심 기능을 강조해야한다고 생각합니다. 변수는 앱 내에서 지속적으로 수정 가능해야합니다. 변수를 편집 할 수는 있지만 서버를 다시 시작하면 기본값으로 돌아갑니다. 이는 나쁘다.

답변

0

좋아, 내가 한 일은 여기에있다. 그냥 이니셜 라이저에 값을 넣는 대신, 그것을 처리하는 간단한 클래스를 만들었습니다. 변수 자체는 미리 정의 된 파일에 저장됩니다. 클래스는 초기화시 파일을 읽는 것 외에도 값이 변경되면 파일을 업데이트하고 정기적으로 파일을 다시 읽으므로 작업자간에 일관성을 유지합니다. 또한 기본적인 JSON 처리 및 백업 기능을 추가하여보다 쉽게 ​​작업 할 수 있도록했습니다.

에 관심있는 사람들을위한, 여기에 중요한 코드입니다 :

class Pomegranate 

    def initialize 
    @delay = 30.minutes 
    @path = "db/pomegranate.json" 
    @valid = Time.now - 1 
    validate 
    end 

    def get(*p) 
    validate 
    p.inject(@data) {|object,key| object[key] if object} 
    end 

    def set(*p, q, v) 
    hash = p.inject(@data) {|object,key| object[key]||={}} 
    hash[q] = v 
    end 

    def save 
    @valid = Time.now + @delay 
    File.open(@path,"w") {|f| f.write(@data.to_json)} 
    end 

    private 

    def validate 
    if @valid < Time.now 
     @data = ActiveSupport::JSON.decode(File.read(@path)) rescue {} 
     @valid = Time.now + @delay 
     @valid = Time.now - 1 if @data.empty? 
    end 
    end 

end 

$pom = Pomegranate.new 
0

출처 : Where to put Global variables in Rails 3

이처럼 applicaton.rb에 넣어보십시오 :

module MyAppName 
    class Application < Rails::Application 
    YOUR_GLOBAL_VAR = "test" 
    end 
end 

그런 다음 당신은 당신의 컨트롤러, 뷰 또는 무엇이든의 네임 스페이스를 호출 할 수 있습니다 ..

MyAppName::Application::YOUR_GLOBAL_VAR 

또 다른 대안은 settingslogic과 같은 것을 사용하는 것입니다. settingslogic을 사용하면 yml 구성 파일과 구성 파일을 가리키는 모델 (Settings.rb) 만 만들면됩니다.

config/initialzers/foo.rb : 어디서나 응용 프로그램에서

MYVARIABLE = 'some string' 

접근 당신은 초기화에서 상수로 선언 할 수

Settings.my_setting 
1

: 그럼 당신은 당신의 레일 응용 프로그램에서 어디서나 이러한 설정에 액세스 할 수 있습니다 as MYVARIABLE

+0

나중에 변수를 변경하면 작업자간에 일관성이 유지됩니까? –

+0

아니요, 잠재적으로 dRuby를 사용하여 모든 작업자에게 업데이트를 알릴 수 있습니다. – rudolph9

2

정말 당신이 찾고있는 것에 따라 다릅니다. 당신은 당신의 application_controller.rb

class ApplicationController < ActionController::Base 
    def system_message 
    "Come buy our amazing .99 iphone chocolate bar apps, with 100% more gamification!" 
    end 
end 

이 함수 (문자열)에 넣어 매우 간단하게 뭔가를 다음 응용 프로그램의 모든 컨트롤러에서 액세스 할 수 있습니다.application.rb 파일의 after_initialize 블록에 무엇인가를 지정할 수도 있습니다.

config.after_initialize do 
    ::MYTEXT = "MY SUPER AMAZING TEXT" 
end 

또한 레일에 미리로드 된 initializers 디렉토리 아래에 자신의 파일을 만들 수 있습니다.

그래서 siteAnnounce.rb

MYANNOUNCEMENT = "NOW LISTEN TO ME!" 

또한 내가 구성 객체, 예를 들어,이 같은 상수와 변수를 넣어 시작했습니다이 Railscast video about site wide announcements

+0

나는 이니셜 라이저쪽으로 기울고있다. 한 가지 질문은 나중에 변수를 변경하면 그것이 근로자간에 일관성이 있느냐는 것입니다. –

+0

변수가 사이트에 하드 코딩되고 코드를 배포하기 위해 서버를 종료해야하며 모든 백업을 돌리면 일관성을 유지해야합니다. 일종의 지속적인 배포 시스템을 사용하여 변수를 변경하려고했지만 내 전문 분야가 아닌 경우 실행되는 유일한 문제입니다. –

0

을 체크 아웃 할 수 있습니다

TestApp::Application.config.foo = 'bar' 
TestApp::Application.config.something = { :a => 1, :b => 2 } 
2

나는 그것을 데이터베이스에 저장하고 캐싱을 처리하도록합니다.

많은 경우 공통 값을 공유해야하는 코드는 전역 변수가 좋지만 사용자보기가 아닌 코드라고 생각합니다.
이 경우 OP가 '앱에서 편집 가능'으로 굵게 표시되어 있기 때문에 분명합니다. 그래서 나는 사용자가 그것을 입력 할 수있는 뷰를 가질 것이고, db 테이블에 저장되고 필요할 때 (한 번 사용되면 캐시 된 것처럼) 다시 불러올 수 있습니다.

2

그럼 난 비슷한 문제에 직면했다. 문제는 모든 레벨 (MVC)에서 전역 변수가 필요하다는 것이 었습니다. 우리는 Memcache을 사용하여 변수를 저장하려고했습니다. 비슷한 해결책을 찾으러 갈 수도 있습니다. 추가 보너스로 프로그램 전체에서 변경할 수 있습니다.