[ruby-on-rails] 매개 변수가있는 before_filter

다음과 같은 방법이 있습니다.

before_filter :authenticate_rights, :only => [:show]

def authenticate_rights
  project = Project.find(params[:id])
  redirect_to signin_path unless project.hidden
end

다른 컨트롤러에서도이 방법을 사용하고 싶기 때문에이 방법을 application_controller에 포함 된 도우미에 복사했습니다.

문제는 일부 컨트롤러에서 프로젝트의 ID가 :id기호가 아니라 fe :project_id( :id다른 모델의 경우 a 도 있음)입니다.

이 문제를 어떻게 해결 하시겠습니까? before_filter 작업에 매개 변수를 추가하는 옵션이 있습니까 (오른쪽 매개 변수를 전달하기 위해)?



답변

나는 다음과 같이 할 것입니다.

before_filter { |c| c.authenticate_rights correct_id_here }

def authenticate_rights(project_id)
  project = Project.find(project_id)
  redirect_to signin_path unless project.hidden
end

correct_id_here에 액세스하기위한 관련 ID는 어디에 있습니까 Project?


답변

일부 구문 설탕으로 :

before_filter -> { find_campaign params[:id] }, only: [:show, :edit, :update, :destroy]

또는 더 멋지게하기로 결정한 경우 :

before_filter ->(param=params[:id]) { find_campaign param }, only: %i|show edit update destroy|

그리고 before_action의 동의어 인 Rails 4 before_filter가 도입되었으므로 다음과 같이 작성할 수 있습니다.

before_action ->(param=params[:id]) { find_campaign param }, only: %i|show edit update destroy|

NB

->람다 리터럴lambda 이라고 하며 Ruby 1.9에서 소개합니다.

%i 기호 배열을 생성합니다.


답변

@alex의 대답을 계속하려면 :except또는 :only일부 방법 을 원할 경우 구문은 다음과 같습니다.

before_filter :only => [:edit, :update, :destroy] do |c| c.authenticate_rights params[:id] end

여기 에서 찾았 습니다 .


답변

do...end가장 명확한 옵션 대신 중괄호를 사용하는 블록 방법을 찾습니다.

before_action(only: [:show]) { authenticate_rights(id) }

before_action 새로운 선호 구문입니다. before_filter


답변

이것은 작동합니다.

project = Project.find(params[:project_id] || params[:id])

이것은 반환해야 params[:project_id]는 PARAMS 해시에있는 경우, 또는 반환 params[:id]이되지 않습니다.


답변