2009-04-27 3 views
4

저는 1 명의 계정에 n 명의 사용자가있을 수있는 다중 사용자, 다중 계정 앱을 개발 중입니다. 모든 사용자는 자신의 계정에서 정보에만 액세스 할 수 있어야합니다. 내 접근 방식은 DB의 모든 모델에 account_id를 추가하고 현재 account_id가있는 객체 만 선택하도록 모든 컨트롤러에 필터를 추가하는 것입니다. 승인 플러그인을 사용하겠습니다.Rails에서 계정 범위의 값을 항상 설정하는 방법은 무엇입니까?

이 방법이 좋은 생각입니까?

항상 모든에

object.account = @current_account 

조치를 CREATE 작성하지 않고 생성 된 모든 객체의 ACCOUNT_ID을 설정하는 가장 좋은 방법은 무엇입니까? 필터일까요?

또한 선택 옵션에 대한 필터를 구현하는 가장 좋은 방법은 확실하지 않습니다. 일반적인 조건과 같은 것이 필요합니다. SQL 문에 표시되는 다른 항목과 상관없이 항상 "where account_id = XY"가 있습니다.

도움 주셔서 감사합니다.

답변

4

이는 User.has_many : 이메일 시나리오와 유사합니다.

class ApplicationController < ActionController::Base 
    def current_account 
    @current_account ||= current_user && current_user.account 
    end 
end 

# In an imagined ProjectsController 
@projects = current_account.projects 
@project = current_account.projects.find(params[:id]) 
+0

다음 보석이 도움이

http://gemcutter.org/gems/account_scopper

희망에 모습을 제공

을 조금 마법을 추가하고 원활하게 수행이 범위 지정을하려면 , 나는 그것을 할 수있는 내 current_account 메서드를 사용하지만 모든 동작을 변경해야합니다. 더 쉬운 방법이 있습니까? 나는 항상 같은 값 (로그인 한 사용자)을 설정하기 때문에 find/create 메소드를 패치하는 것에 대해서 생각했다. –

+0

모든 작업에서이 작업을 수행하는 것은 문제가되지 않습니다. 일회성 노력 뿐이에요. 5 분, 뭐라 구요? 또한 코드를 이해하기 쉽게 만듭니다. 바로 거기에있어 추상화를 볼 필요가 없습니다. –

+1

5 분이 조금 넘었지만 내 솔루션으로 많은 번거 로움과 monkeypathing 후 난 그냥 레일 방식으로 할 것입니다. 감사. –

1
:

귀하의 경우
@emails = current_user.emails 

, 당신은 아마 같은 것을 할 수 있습니다 : 당신은 URL의 ID를 변경하여 다른 사람의 이메일을 확인하기 위해 사용자가 원하지 않는, 그래서 당신은이 작업을 수행

당신이 모델의 세션 변수 나 인스턴스 변수에 접근하면 MVC 패턴을 이해하지 못했고 "PHP로 돌아 가야한다"는 것을 압니다. 하지만 우리가 좋아하는 컨트롤러와 액션이 많은 경우 @ current_account.object.do_something (별로 DRY하지 않음)을 쓰고 싶지 않은 경우에도이 방법은 매우 유용 할 수 있습니다.

내가 찾은 해결책은 매우 간단합니다 :

1 단계 : 의 모든 모델에 current_account 방법을 추가 : 2 단계

class ApplicationController < ActionController::Base 
    before_filter :get_current_account  

    protected 
    def get_current_account 
    # somehow get the current account, depends on your approach 
    Thread.current[:account] = @account 
    end 
end 

예를 들어, 그래서 이 Thread.current에 current_account 추가

#/lib/ar_current_account.rb 
    ActiveRecord::Base.class_eval do 
    def self.current_account 
     Thread.current[:account] 
    end 
    end 

3 단계 : 짜잔, 당신의 모델에이 같은 작업을 수행 할 수 있습니다

class MyModel < ActiveRecord::Base 

    belongs_to :account 

    # Set the default values 
    def initialize(params = nil) 
    super 
     self.account_id ||= current_account.id 
    end 

end 

active_record의 before_validation 콜백과 같은 작업을 수행 한 다음 계정이 항상 설정되어 있는지 확인하여 확인할 수도 있습니다.

항상 모든 작성된 오브젝트에 current_user를 추가하려는 경우 동일한 접근 방식을 사용할 수 있습니다.

당신은 어떻게 생각하십니까?

+1

내가 위에서 언급 한 것처럼, 모든 행동에 그것을 언급하는 것은 문제가되지 않는다. 그것은 일회성 직업이며, 오래 걸리지 않습니다. –

1

두 번째 질문에 답하려면 Rails 2.3의 새로운 default_scope 기능을 확인하십시오.

+0

위대한, 정확히 내가 필요한 것! –

1

나는 귀하가 항상 귀하의 계정 범위에 대해 신경 쓰지 않기를 바랍니다. 솔직히 말해서, 그것은 **의 고통입니다. 세바스티앙 그로스 진 - - ZenCocoon

+0

SO/Firefox의 일부 조합은 링크가 나를 위해 작동하지 않는다는 것을 의미합니다 - 404s. 동일한 위치에 대한 대체 링크 : http://is.gd/4SyvE – NeilS

+0

URL 수정을위한 주셔서 감사합니다 NeilS. –

관련 문제