이것은 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으로 그렇게 할 수 있습니다. 그들은이 목적을 위해 의도 된 것이 아니지만 확실히 당신을 위해 일을 끝낼 것입니다.
에서
observers
의 사용을 원하는 여전히있는 경우가 이러한 경우의 발생이 안된다? 보통 그들은'@ current_user'와 같은 인스턴스 변수가 아니라'current_user'와 같은 메소드를 제공합니다. 아니면 어딘가에서'@ current_user'를 수동으로 생성합니까? 그렇다면 세션 변수 등을 전달하거나 저장해야합니다. – MrDanA