2012-02-22 2 views
2

나는 기본적으로 다음과 같은 패턴을 따르는 인보이스 응용 프로그램을 구축하고있다 :Rails 모델에서 current_user에 액세스 하시겠습니까?

이제

Users < Clients < Projects < Invoices

Invoice 모델에 넣고 각 사용자에 대해 송장 번호를 autoincrementing 생성하기 위해 :

before_create :create_invoice_number 

    def create_invoice_number 
    val = @current_user.invoices.maximum(:number) 
    self.number = val + 1 
    end 

그러나 current_user 변수는 Rails의 모델에서 액세스 할 수없는 것 같습니다.

이 문제를 해결하려면 어떻게해야합니까?

+0

에서 observers의 사용을 원하는 여전히있는 경우가 이러한 경우의 발생이 안된다? 보통 그들은'@ current_user'와 같은 인스턴스 변수가 아니라'current_user'와 같은 메소드를 제공합니다. 아니면 어딘가에서'@ current_user'를 수동으로 생성합니까? 그렇다면 세션 변수 등을 전달하거나 저장해야합니다. – MrDanA

답변

9

이것은 Rails에서의 분리 문제로 인해 발생하며 다루기가 다소 까다로운 문제입니다. Rails 패러다임에서 모델은 직접 전달 된 것 이상의 애플리케이션 상태에 대한 지식이 없어야하므로 대부분의 Rails 코더는 current_user에 대해 알아야 할 모델이 코드 냄새라고 알려줄 것입니다.

그렇다면 세 가지 방법이 있습니다. 각각 "더 정확합니다"(또는 적어도 나는 그렇게 생각할 것입니다).

첫째, 송장 내부 사용자에게 연결을 만드는 시도하고 컨트롤러에서 사용자에게 송장을 사용하고 있습니다 :

class InvoicesController < ApplicationController 

... 

def create 
    @invoice = current_user.invoices.create(params[:invoice]) 
    ... 
end 

그리고 모델에 : 그 아무튼 경우

belongs_to :user 

def create_invoice_number 
    self.user.invoices.maximum(:number) + 1 
end 

' 이 작업은 컨트롤러에서 수동으로 수행하십시오. 그것은 당신이 관리 할 수있는 컨트롤러가 항상 마른해야한다는 사실이다, 그러나 이것은 응용 프로그램 수준의 문제가 명확하기 때문에 컨트롤러는 넣을 수있는 곳은 다음과 같습니다

class InvoicesController < ApplicationController 

... 

def create 
    @invoice = Invoice.create(params[:invoice]) 
    @invoice.update_attribute(:number, current_user.invoices.maximum(:number)) 
    ... 
end 

마지막으로, 당신은 정말, 정말 해소하려는 경우를 컨트롤러와 모델은 ActionController::Sweepers으로 그렇게 할 수 있습니다. 그들은이 목적을 위해 의도 된 것이 아니지만 확실히 당신을 위해 일을 끝낼 것입니다.

+1

절대적으로 모델 내에서 현재 사용자에게 액세스하는 것은 코드 냄새입니다. +1 –

+0

안녕하세요. 도움에 감사드립니다. 첫 번째 버전은 작동하지 않습니다. 왜냐하면 어떻게 든'current_user' 메쏘드는 모델에서 사용할 수 없기 때문입니다. 두 번째 버전은 작동하지만 내 컨트롤러가 부 풀리기 때문에 조금 추한 것 같습니다. – Tintin81

+0

첫 번째 버전은 컨트롤러가 아닌 컨트롤러에 설치됩니다. – Veraticus

1

는 다음 인증을 위해 사용하는 어떤 레일

+0

관찰자가 정의되고 작동하는 방법을 먼저 이해해야합니까? –

+0

@Veraticus 대답은 당신이 원하는 것을 충족시켜야합니다 ... dnt는 실제로는 그렇지 않을 때 복잡하게 만듭니다;) –

관련 문제