Настраивай это
13.10.2013 в 16:00 ruby rails gemКогда у любого проекта появляются пользователи, это приносит первые радости и первые же головные боли. Одному нужно то, второму чтобы тоже самое, но не как у всех и прочие "прелести". Именно тут помогают индивидуальные настройки пользователей. Разумеется они не решают всех вышеописанных проблем, но очень помогают в их решении. Тут главное не переусерсотвовать с количеством пользовательских настроек и не запутаться самому. Хочу расказать про свой опыт в этом вопросе. Я расскажу про gem store_configurable. Это очень простой и понятный в использовании gem.
Для установки выполните команду:
gem install store_configurable
... и добавьте в Gemfile строку:
gem 'store_configurable'
Далее создайте миграцию для создания в модели пользователя поля, где будет храниться собственно сама его настройка:
rails g migration AddConfigToUsers _config:text
...
rake db:migrate
Добавляем в модель User или ту, что у вас вполняет эти функции в начало файла строку store_configurable:
class User < ActiveRecord::Base
store_configurable
# бла-бла-бла
end
Так же неплохо добавить в модель метод для настройки конфигурации по умолчанию для вновь созданных пользователей или для тех у кого еще нет настроек:
before_save :default_config
protected
def default_config
self.config.refresh_interval = 180 if self.config.refresh_interval.empty?
self.config.time_zone = 'Moscow' if self.config.time_zone.empty?
end
В контроллере создаем методы для редактирования:
# GET /users/1/setup
def setup
@user = User.find(params[:id])
end
... сохранения настроек:
# PUT /users/1/save_settings
def save_settings
@user = User.find(params[:id])
respond_to do |format|
params[:user][:config].each do |name, value|
@user.config[name] = value
end
if @user.save
format.html { redirect_to :root, notice: 'Настройки пользователя успешно обновлены.' }
else
format.html { redirect_to :user_setup, alert: 'Неверные параметры настройки! Попробуйте снова!' }
end
end
end
... и форму для их редактирования:
= simple_form_for @user, url: user_settings_path(@user), method: :put, html: { class: 'form-horizontal form', id: 'form' } do |f|
.form-header
%h3= "Изменение настроек пользователя "+@user.realname
.form-inputs
= f.simple_fields_for :config do |c|
.control-group.string.user_config_timezone
%label.select.control-label Временная зона
.controls
= c.time_zone_select :time_zone, ActiveSupport::TimeZone.all.sort, model: ActiveSupport::TimeZone, default: @user.config.time_zone, class: 'form-input'
= c.input :refresh_interval, label: 'Время обновления списка, секунд', required: false, input_html: { class: 'form-input', value: @user.config.refresh_interval }
.form-actions
.pull-right.btn-group
= f.submit 'Сохранить настройки', class: 'btn btn-success'
= link_to 'Отмена', :root, class: 'btn
Как-то так... Я же говорил, что все будет просто и понятно.