Настраивай это

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

Как-то так... Я же говорил, что все будет просто и понятно.