Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

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

Anna | 20.06.2014 | нет комментариев
На днях я решал задачу по хранению данных в 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)

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB