image

Я только недавно познакомился с миром Rails, и как у каждого первоклассника возникает дюжина вопросов, большинство с которых у бывалого девелопера могут вызвать улыбку на лице. Написав первых три проекта у меня возник банальный вопрос хранения дополнительных конфигурационных данных в файле. То есть, при старте мы читаем данные с пользовательского конфигурационного файла, в ходе работы app можем при необходимости что-то изменить и все аккуратно сохранить в тот же файл.

В итоге изучения данного вопроса я искал gem, функционал которого выполняет данную миссию, но не нашел. Скорее всего я чего то делаю не так, поскольку в документации gem'а config я не вижу как сохранить данные в файл (думаю проблема в моем недопонимании)

И так, моя реализация:

  • В качестве формата хранения я выбрал YAML.
  • Пользовательский файл конфигурации — config/settings.yml.
  • Для примера будем хранить хеш з ключами name и email


Первым делом редактируем config/application.rb

require 'yaml'
if File.exist? Rails.root.join('config', 'settings.yml')
    config.settings = YAML::load_file(Rails.root.join('config', 'settings.yml'))
else
    config.settings = {}
end


Контроллер settings_controller.rb
class Admin::SettingsController < AdminController

  def index
    @settings=Rails.application.config.settings
  end

  def create
    flash[:success] = "Даные успешно сохранены"
    File.open("settings.yml", "w") do |file|
      file.write settings_params.to_yaml
    end
    Rails.application.config.settings=settings_params
    redirect_to admin_settings_index_path

  end

  private
  def settings_params
    params.permit(:name, :email)
  end
end



Ну и собственно вьюха
<% provide(:title, 'Конфигурация') %>
<%= bootstrap_form_tag @settings do |f| %>
<%= f.text_field :name, label: "Название", value: f.options[:name] %>
<%= f.text_field :email, label: "e-mail", value: f.options[:email] %>
<%= f.submit " Сохранить ", class: "btn btn-success" %>
  <%= link_to " Назад ", admin_root_path, class: "btn btn-danger" %>
<% end %>

Комментарии (4)


  1. rinat_crone
    09.03.2016 05:08
    +3

    Вы там CMS на рельсе, что ли, пишете? А если инстанс приложения умрет и нужно будет поднять рядом новый из репозитория (он ведь есть, да?), то где будет Ваш файл? Не страдайте ерундой, заведите таблицу с настройками и почитайте про twelve-factor apps, в частности, о подходах к конфигурации приложения: http://12factor.net/ru/config.

    И сходу ещё вопрос: что именно Вы посчитали достойным внимания в Вашем коде? Вы бы начали лучше знакомство с рельсой с изучения основ – style guide, best practices и т.д., а не с написания статей :)

    Всем полимерных связей, поцоны! (https://habrahabr.ru/post/261835/#comment_8494863)


    1. savio
      09.03.2016 10:33

      Наверное да, это чем то напоминает мини CMS. Rails это ж фреймворк насколько я понимаю.
      Спасибо, мне нужен был волшебный пендаль для направления вектора моего самообразования.
      Ушел читать :)


  1. avdept
    09.03.2016 14:54

    Макаки уже добрались и до рельс :(


    1. foxmuldercp
      10.03.2016 11:06

      Та до всего они добрались, что денег может принести.
      Так что умным хорошим программистам будет, что на хлеб с маслом намазывать.