[英]Ruby on Rails - filtered @ variable persisted between logins
首先,這里是我的紅寶石和鐵軌版本,其中包含幾個重要的寶石版本。
我使用了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.