簡體   English   中英

設計問題(Ruby On Rails)

[英]Design Question (Ruby On Rails)

在我的系統中有許多類型的用戶(4),基於登錄的用戶,他們只能訪問某些信息。

例如,我試圖在我的客戶端模型中執行類似的操作:

 class Client
     def self.allowed
        if current_user.is_a?(SuperAdmin)
          return self.all
        elsif current_user.is_a?(Client)
          return [current_user]
        elsif current_user.is_a?(ClientAdmin)
          return [current_user.client]
        end
      end
   end

問題是,似乎我的模型無法訪問current_user幫助器方法。 (未定義的局部變量或方法`current_user'表示#)

我有兩個問題:

  1. 我怎樣才能解決這個問題
  2. 是否應該在模型中完成返回允許的客戶端等邏輯?

使用您的方法,我將定義允許傳入用戶進行檢查的方法,如下所示:

class Client
   def self.allowed(user)
      if user.is_a?(SuperAdmin)
        return self.all
      elsif user.is_a?(Client)
        return [user]
      elsif user.is_a?(ClientAdmin)
        return [user.client]
      end
    end
 end

然后,您的控制器可以根據正在執行的操作決定應該檢查哪個用戶(雖然這通常是current_user ,這將釋放您的實現以與任何用戶一起工作,因此如果您決定在以后添加依賴於該事實的功能你被保險了。

話雖這么說,你應該去授權庫; 我個人非常喜歡CanCan 它允許您使用與此處提供的樣式類似的樣式在一個位置定義授權。 作者Ryan Bates 對使用CanCan進行精彩的截屏視頻

1.我該如何解決這個問題

如果沒有看到您嘗試訪問該方法的方法,我無法分辨,但您可能會在ApplicationController考慮以下內容:

before_filter :set_current_user

def set_current_user
  Client.current_user = current_user
end

這會在您的Client模型中提供current_user的副本。

2.應該在模型中完成諸如恢復允許的客戶端之類的邏輯嗎?

我使用過的大多數身份驗證系統都將current_user (或等效函數)放在ApplicationController ,並提供了保護特定控制器操作不被未授權用戶訪問的方法。 畢竟,控制器應該決定哪些用戶能夠訪問他們的操作,而不是模型。

一般來說,如果您嘗試從模型中訪問控制器的成員/方法,那么您做錯了 - 這不是信息應該通過MVC應用程序傳遞的方式。

暫無
暫無

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

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