rails query generate before ruby-on-rails ruby ruby-on-rails-3 before-filter

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 .