:
귀하의 경우
@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를 추가하려는 경우 동일한 접근 방식을 사용할 수 있습니다.
당신은 어떻게 생각하십니까?
잘
다음 보석이 도움이http://gemcutter.org/gems/account_scopper
희망에 모습을 제공
을 조금 마법을 추가하고 원활하게 수행이 범위 지정을하려면 , 나는 그것을 할 수있는 내 current_account 메서드를 사용하지만 모든 동작을 변경해야합니다. 더 쉬운 방법이 있습니까? 나는 항상 같은 값 (로그인 한 사용자)을 설정하기 때문에 find/create 메소드를 패치하는 것에 대해서 생각했다. –
모든 작업에서이 작업을 수행하는 것은 문제가되지 않습니다. 일회성 노력 뿐이에요. 5 분, 뭐라 구요? 또한 코드를 이해하기 쉽게 만듭니다. 바로 거기에있어 추상화를 볼 필요가 없습니다. –
5 분이 조금 넘었지만 내 솔루션으로 많은 번거 로움과 monkeypathing 후 난 그냥 레일 방식으로 할 것입니다. 감사. –