Вот пример такого файла с настройками:
--- api_url: value: example.com/api role: 4 api_login: value: user role: 4 api_password: value: 12355 role: 4
В данном случае, у нас есть три переменных, в которых хранится информация о доступе к API. Каждый ключ является хешем чтобы хранить значение переменной и минимальную роль пользователя, который имеет доступ к этим данным.
Теперь напишем класс, который умеет читать и редактировать эти данные, учитывая при этом права пользователя в системе.
require 'yaml' class Setting CONFIG_FILE = 'settings.yml' class << self def get(key) load_settings[key.to_s]['value'] end def update(params, role) settings = load_settings params.each do |key, value| key = key.to_s settings[key]['value'] = value.to_s if has_access?(role, key) end save_settings(settings) end def has_access?(role, key) return unless setting = load_settings[key] role >= setting['role'] end def load_settings @config ||= YAML.load(File.read(file_path)) end private def save_settings(settings) File.write(file_path, settings.to_yaml) end def file_path "config/#{CONFIG_FILE}" end end end
Получение данных по ключам может осуществляться следующим образом:
Setting.get('api_login') Setting.get('api_password') …
Обновление данных осуществляется с учетом прав пользователя, то есть никакие проверки вне класса не потребуются. Можно передать просто хеш с данными и обновления будут произведены по тем данным, которые доступны пользователю для редактирования. Это позволяет смело передавать все данные введенные пользователем:
Setting.update(params[:settings], current_user.role)
Мы передаем хеш с информацией, которую нужно обновить и текущие права пользователя.
Метод, который хранит в себе путь к файлу с настройками можно задать и более удобно, если вы делаете это в Rails:
Rails.root.join('config', CONFIG_FILE)
ссылка на оригинал статьи http://habrahabr.ru/post/202588/
Добавить комментарий