[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
기호 배열을 생성합니다.
답변
답변
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]
이되지 않습니다.