ruby-on-rails - query - rails session
before_filter con parĂ¡metros (5)
Tengo un método que hace algo como esto:
before_filter :authenticate_rights, :only => [:show]
def authenticate_rights
project = Project.find(params[:id])
redirect_to signin_path unless project.hidden
end
También quiero utilizar este método en algunos otros Controladores, así que copié el método a un ayudante que está incluido en el controlador de la aplicación.
el problema es que, en algunos controladores, la identificación para el proyecto no es el símbolo :id
sino fe :project_id
(y también a :id
está presente (para otro modelo)
Como resolverías este problema? ¿Existe una opción para agregar un parámetro a la acción before_filter (para pasar el parámetro correcto)?
Con algo de azúcar sintáctico:
before_filter -> { find_campaign params[:id] }, only: [:show, :edit, :update, :destroy]
O si decides ser aún más elegante:
before_filter ->(param=params[:id]) { find_campaign param }, only: %i|show edit update destroy|
Y desde Rails 4 before_action
, un sinónimo de before_filter
, se introdujo, por lo que se puede escribir como:
before_action ->(param=params[:id]) { find_campaign param }, only: %i|show edit update destroy|
nótese bien
->
significa lambda
, llamado literal lambda , introducir en Ruby 1.9
%i
crearé una matriz de símbolos
Encuentro que el método de bloques con llaves en lugar de do...end
es la opción más clara
before_action(only: [:show]) { authenticate_rights(id) }
before_action
es simplemente la sintaxis preferida más nueva para before_filter
Esto debería funcionar:
project = Project.find(params[:project_id] || params[:id])
Esto debería devolver params[:project_id]
si está presente en params hash, o return params[:id]
si no lo está.
Lo haría así:
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
Donde es correct_id_here
el ID relevante para acceder a un Project
.
Para continuar con la respuesta @alex, si desea :except
o :only
algunos métodos, aquí está la sintaxis:
before_filter :only => [:edit, :update, :destroy] do |c| c.authenticate_rights params[:id] end
Encontrado here .