簡體   English   中英

Ruby on Rails-過濾的@變量在兩次登錄之間仍然存在

[英]Ruby on Rails - filtered @ variable persisted between logins

首先,這里是我的紅寶石和鐵軌版本,其中包含幾個重要的寶石版本。

  • Ruby 1.9.3-p125
  • Rails 3.2.2
  • 設計2.0.4
  • CanCan 1.6.7

我使用了Daniel Kehoe的模板來使項目快速啟動並運行。

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

我的問題:

我有一個管理部分,用於創建新用戶和具有此功能的兩個角色。 我有一個要求,管理員用戶應該不能創建超級管理員用戶。

當管理員登錄並單擊新用戶按鈕時,將過濾角色列表以刪除superadmin選項,如果我注銷admin角色並以超級管理員身份登錄,然后創建一個用戶,則我具有來自admin的過濾列表。 如果我刷新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保留了具有不同角色的用戶在兩次登錄/注銷之間的價值,但隨后被清除,那將非常有幫助,謝謝,我已經為此花了一個多小時和其他一些。

@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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM