Постоянная переменная в Rails - PullRequest
4 голосов
/ 29 февраля 2012

Допустим, поверх моего приложения на Rails есть панель с отображаемым фрагментом текста - последнее горячее предложение, уведомление о запланированном простое, что-то в этом роде.Это единая, уникальная информация, к которой нужно обращаться практически по каждому запросу, и которая может время от времени обновляться.Каков наилучший способ добиться этого?

Что я хотел бы сделать - это какая-то постоянная глобальная переменная (доступная из контроллеров).

  • Она будет обновляться очень редко, поэтому не возникает проблем, если в течение некоторого времени после обновления между работниками возникает несоответствие.
  • С другой стороны, оно должно быть постоянным в случае сбоя сервера (достаточно периодического резервного копирования).
  • Он будет доступен очень часто, поэтому он должен быть как можно быстрее - желательно, чтобы он оставался в памяти.
  • Кроме того, он единственный в своем роде, поэтому я действительно предпочел бы не раздувать приложениемодель выделенной базы данных.

Нечто подобное, например, чертовски просто в Node.js, но я не смог найти ни одного способа добиться этого в Rails.Что мне делать?

РЕДАКТИРОВАТЬ

Спасибо за ответы, но пока они вдохновляют, я думаю, что я должен подчеркнуть одну ключевую функциональность, которую онивсе пропали. Переменная должна быть редактируемой внутри приложения и должна быть постоянной. Хотя возможно изменить ваши переменные, в случае перезапуска сервера я возвращаюсь к настройкам по умолчанию - что плохо.

Ответы [ 7 ]

2 голосов
/ 29 февраля 2012

Я бы сохранил его в базе данных и позволил бы кэшированию позаботиться об этом.

Я чувствую, что глобальные переменные хороши, когда это уместно, для кода, который должен иметь такое же общее значение во многих местах, но этокод, а не пользовательское представление.
Это очевидно в этом случае, поскольку OP выделен жирным шрифтом «редактируемый приложением».Поэтому у меня будет представление, которое позволяет пользователям вводить его, оно сохраняется в таблице базы данных, а затем вызывается по мере необходимости (как кешируется, когда-то использованный один раз).

2 голосов
/ 29 февраля 2012

Ну, я столкнулся с подобной проблемой.Моя проблема была в том, что мне нужна глобальная переменная на всех уровнях (MVC).Мы использовали Memcache для хранения переменной.Может быть, вы можете пойти на подобное решение.И в качестве дополнительного бонуса вы можете изменить его на протяжении всей программы.

2 голосов
/ 29 февраля 2012

Это действительно зависит от того, что вы ищете. Вы могли бы сделать что-то очень просто, вставив это в 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

Эта функция (и строка) затем доступна из любого контроллера в вашем приложении. Вы также можете указать что-то в блоке after_initialize в вашем файле application.rb.

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

Вы также можете создать свой собственный файл в каталоге initializers, который предварительно загружен в rails.

так siteAnnounce.rb

MYANNOUNCEMENT = "NOW LISTEN TO ME!"

Возможно, вы также захотите посмотреть это видео Railscast о объявлениях для всего сайта

1 голос
/ 29 февраля 2012

Хорошо, вот что я сделал.Вместо того, чтобы просто помещать значение в инициализатор, я создал простой класс, который его обрабатывает.Сама переменная хранится в предопределенном файле.Помимо чтения файла при инициализации, класс обновляет файл при изменении значения, а также периодически перечитывает файл для обеспечения согласованности между работниками.Я также добавил некоторые базовые функции обработки и резервного копирования 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
1 голос
/ 29 февраля 2012

Вы можете объявить это как константу в инициализаторе:

config/initialzers/foo.rb * * 1004

 MYVARIABLE = 'some string'

Доступно из любого места в вашем приложении как MYVARIABLE

0 голосов
/ 29 февраля 2012

Я начал помещать такие константы и переменные в объект конфигурации, например,

TestApp::Application.config.foo = 'bar'
TestApp::Application.config.something = { :a => 1, :b => 2 }
0 голосов
/ 29 февраля 2012

Источник: Где поместить глобальные переменные в Rails 3

Попробуйте поместить его в ваш applicationaton.rb следующим образом:

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

Затем вы можете вызвать егос пространством имен в ваших контроллерах, представлениях или чем-то еще.

MyAppName::Application::YOUR_GLOBAL_VAR

Другой альтернативой будет использование чего-то вроде settingslogic .С settingslogic вы просто создаете файл конфигурации yml и модель (Settings.rb), которая указывает на файл конфигурации.Затем вы можете получить доступ к этим настройкам в любом месте вашего приложения rails с помощью:

Settings.my_setting
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...