Ruby on Rails - фильтрованная переменная @ сохраняется между логинами - PullRequest
0 голосов
/ 29 марта 2012

Во-первых, это моя версия ruby ​​и rails с парой важных версий гемов.

  • Ruby 1.9.3-p125
  • Rails 3.2.2
  • Devise 2.0.4
  • CanCan 1.6.7

Я использовал шаблон от Дэниела Кехо, чтобы быстро запустить и запустить проект.

$ rails new myapp -m https://raw.github.com/RailsApps/rails3-application-templates/master/rails3-devise-rspec-cucumber-template.rb -T

Моя проблема:

У меня есть раздел администрирования для создания новых пользователей и две роли с этой возможностью.У меня есть требование, пользователи с правами администратора не должны иметь возможность создавать пользователей superadmin.

Когда администратор входит в систему и нажимает на кнопку нового пользователя, список ролей фильтруется для удаления опции superadmin, если я выхожу изроль администратора и войдите в систему как суперадмин, затем создайте пользователя, у меня есть отфильтрованный список от администратора.Если я обновляюсь 5-6 раз, я получаю правильно отфильтрованный список.

Модель пользователя

# /app/models/user.rb
class User < ActiveRecord::Base
  ROLES = { 
    superadmin: 'superadmin', 
    admin:      'admin'
  }

  def role?(role)
    self.role == role.to_s
  end
end

Контроллер пользователя

# /app/controllers/admin/users_controller.rb
module Admin
  class UsersController < BaseController
    load_and_authorize_resource

    def new
      @user = User.new
      @roles = User::ROLES

      if current_user.role? :admin
        @roles.delete :superadmin
      end
    end
  end
end

Просмотр

# /app/views/admin/users/_form.html.haml
= form_for [:admin, @user], html: { class: 'form-horizontal' } do |f|
  ...
  .control-group
    = f.label :role, class: 'control-label'
    .controls
      = f.select :role, @roles, selected: :admin

Если кто-нибудь может указать мне правильное направление относительно того, почему @roles сохраняет свое значение между входом в систему / выходом из системы для пользователей с различными ролями, но затем очищается, что было бы действительно полезно, спасибо, я был озадачен этим болеечас, как и несколько других.

1 Ответ

1 голос
/ 29 марта 2012

строка @roles = User::ROLES получает ссылку на User :: ROLES вместо копии. Поэтому, когда вы вызываете @roles.delete :superadmin, вы также изменяете User :: ROLES.

Я предполагаю, что после 5-6 запросов ваш запрос обрабатывается другим процессом, глобальная копия которого (еще) не была изменена.

Чтобы решить проблему, измените @roles = User::ROLES на @roles = User::ROLES.dup

Или измените @roles.delete :superadmin на @roles = @roles.except(:superadmin)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...