Работа с данными в Yaml

от автора

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

Вот пример такого файла с настройками:

--- 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/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *