2014-01-07 2 views
2

Я хочу, чтобы иметь возможность редактировать YAML файл и загрузить его через Rails 4 приложение. Прямо сейчас я загружаю файл YAML через initializer, и я знаю, что это будет загружать файл только один раз, и после его изменения потребуется перезагрузка.Изменение файла YAML без перезагрузки Rails 4

Как я могу выполнить перезагрузку/обновление YAML, как это делается через i18n YAML файлов в Rails?

ответ

2

Когда вы загружаете файл, я предполагаю, что вы назначили его некоторой переменной или константе. Если вместо этого вы не назначили его, загрузка будет выполняться каждый раз.

Вместо:

CONTENT = Yaml.load_file('your_file.yml') 

создать простой класс или функцию:

module YourFileReader 
    def self.load 
    Yaml.load_file('your_file.yml') 
    end 
end 

и использовать определенный метод для чтения файла в приложении

YourFileReader.load 

или еще проще , использование

Yaml.load_file('your_file.yml') 

прямо в вашем приложении, где вы должны прочитать файл.

+0

Отличное спасибо! – mahatmanich

+0

Возможно, это не идеальный вариант, вы будете загружать файл и анализировать его при каждом запросе, который вызывает 'YourFileReader.load'. Учитывая, что диск IO часто является самым большим узким местом, это может привести к серьезным регрессиям на загруженном сайте. См. Мое решение для одного способа перезагрузки и повторного просмотра файла только при смене файла. – bbozo

2

Вы можете попробовать что-то в линиях проверки времени изменения файла, например:

module MyFileReader 
    def self.my_yaml_contents 
    if @my_yaml_file_ctime != File.ctime(file_name) 
     @my_yaml_contents = YAML.load(File.open(file_name)) 
     @my_yaml_file_ctime = File.ctime(file_name) 
    end 
    @my_yaml_contents 
    end 
end 

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

см http://www.ruby-doc.org/core-2.0.0/File.html#method-c-ctime

+0

Вы правы о узком месте ;-) спасибо за ответ @bbozo – mahatmanich

+0

Эй, похоже, это не сработает, и вы не захотите использовать mtime для проверки на наличие изменений? – mahatmanich

Смежные вопросы