2012-03-28 83 views
0

首先,這裏是我的ruby和rails版本,其中包含一些重要的gem版本。Ruby on Rails - 過濾@變量在登錄之間持續存在

  • 的Ruby 1.9.3-P125
  • 的Rails 3.2.2
  • 設計2.0.4
  • 慘慘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選項,如果我註銷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點我是保持其價值之間登錄/註銷用戶具有不同的角色,但然後被清除,這將是真正的很有幫助的感謝,我已經在一個小時以上和其他一些人一樣陷入了困境。

回答

1

@roles = User::ROLES得到參考到User :: ROLES而不是副本。所以,當你打電話給@roles.delete :superadmin時,你也在修改User :: ROLES。

我猜在5-6個請求後,你的請求是由一個不同的進程提供的,它的全局副本還沒有被修改過。

爲了解決provlem,改變@roles = User::ROLES@roles = User::ROLES.dup

或者改變@roles.delete :superadmin@roles = @roles.except(:superadmin)

+0

謝謝,這個問題解決了。我有一種感覺是這個問題,但不知道如何解決這個問題。我嘗試.to_hash等,沒有工作:) – CoderHulk 2012-03-28 23:40:54