Ich habe eine Methode, die so etwas macht:
before_filter :authenticate_rights, :only => [:show]
def authenticate_rights
project = Project.find(params[:id])
redirect_to signin_path unless project.hidden
end
Ich möchte diese Methode auch in einigen anderen Controllern verwenden, daher habe ich die Methode in einen Helfer kopiert, der im application_controller enthalten ist.
Das Problem ist, dass in einigen Controllern die ID für das Projekt nicht das :id
Symbol ist, sondern zB :project_id
(und auch a :id
vorhanden ist (für ein anderes Modell)
Wie würden Sie dieses Problem lösen? Gibt es eine Option, um der Aktion before_filter einen Parameter hinzuzufügen (um den richtigen Parameter zu übergeben)?
,:only => [:show]
Symbol hinzuzufügen ? Ich erhalte einen Fehler beim Versuchbefore_filter { |c| c.authenticate_rights correct_id_here }, :only => [:show]
before_filter(:only => [:show]) { <block_code_here> }
. Weitere Beispiele hier: apidock.com/rails/ActionController/Filters/ClassMethods/…before_filter
Methode privat machen, müssen Sie sie möglicherweise neu faktorisieren (z. B. auf einen übergeordneten Controller, ApplicationController usw. verschieben),c.send(:filter_name, ...)
da der Filter nicht im Controller-Kontext ausgeführt wird. guides.rubyonrails.org/…Mit etwas syntaktischem Zucker:
Oder wenn Sie sich entscheiden, noch ausgefallener zu werden:
Und da Rails 4
before_action
, ein Synonym fürbefore_filter
, eingeführt wurde, kann es wie folgt geschrieben werden:NB
->
steht fürlambda
, Lambda-Literal genannt , in Ruby 1.9 einführen%i
erstellt ein Array von Symbolenquelle
find_campaign
der private Methodenname? Inparam=params[:id]
istparam
der Name der neuen lokalen Variablen, an die als Argument übergeben wirdfind_campaign
? Das heißt, dassfind_campaign
wir innerhalb der privaten Methode selbstparam
nicht verwendenparams{:id]
?find_campaign
könnte auch sein, aber ich würde es privat machen, um sicherzugehen, dass wir nicht offenlegen, was nicht konsumiert wird.params
ist eine Hash-Variable, die unseren Methodenparam
zur Verfügung steht. Ist eine Variable, die Sie an die Methode find_campaign übergeben müssen, z. B.before_action ->(campaign_id=params[:id]) { find_campaign(campaign_id) }, only: %i| show edit update destroy |
Um die Antwort von @alex fortzusetzen, wenn Sie möchten
:except
oder:only
einige Methoden, ist hier die Syntax:Gefunden hier .
quelle
Ich finde die Blockmethode mit geschweiften Klammern
do...end
die klarste Optionbefore_action
ist nur die neuere bevorzugte Syntax fürbefore_filter
quelle
Das sollte funktionieren:
Dies sollte zurückgegeben werden,
params[:project_id]
wenn es im params-Hash vorhanden ist, oder zurückgeben,params[:id]
wenn dies nicht der Fall ist.quelle
project_id
vorhanden, stellt dieor
Klausel sicher, dass dies verwendet wird - nur wenn aproject_id
nicht angegeben wird, wird derid
Parameter ausgewählt. Mit anderen Worten: Wenn beide Parameter angegeben werden, stellt dieor
Klausel sicher, dass der richtige Wert verwendet wird, wie es immer bevorzugt wirdproject_id
. Natürlich möchten Sie diese Methode nicht aufrufen, wenn keine vorhanden ist oder wenn keineproject_id
vorhanden ist, aber eine vorhanden ist,id
die nicht auf ein Projekt verweist.