...

понедельник, 18 ноября 2013 г.

[Из песочницы] Работа с данными в 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)


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers.


Комментариев нет:

Отправить комментарий