Rails 4 before_action, pasar parámetros al método invocado

84

Tengo el siguiente código:

class SupportsController < ApplicationController
  before_action :set_support, only: [:show, :edit, :update, :destroy]
  ....

¿Es posible pasar una cadena al método set_supportque se aplicará para los 4 métodos de vista? ¿Es posible pasar una cadena diferente al método set_supportpara cada método en la vista?

Parsa
fuente

Respuestas:

161
before_action only: [:show, :edit, :update, :destroy] do
  set_support("value")
end
Linus adelfa
fuente
6
Combinando @tihom y esta respuesta, puede obtener algo como esto before_action only: [:show, :edit, :update, :destroy] do |c| c.set_support(params[:action) end
germs12
Sugiero una cadena como: before_action {| action | action.update_user_balance (10000)}, donde update_user_balance es un método modelo que obtiene los parámetros: def update_user_balance (arg) ... end
mmike
1
Esto funciona bien con métodos más largos; de lo contrario, usaría la respuesta enviada por Kyle Decot a continuación.
jkwok
52

Puedes usar una lambda:

class SupportsController < ApplicationController
  before_action -> { set_support("value") }, 
    only: [:show, :edit, :update, :destroy]
  ...
Kyle Decot
fuente
10

Una respuesta breve y de una sola línea (que personalmente prefiero para las devoluciones de llamada ) es:

before_action except:[:index, :show] { method :param1, :param2 }

Otro ejemplo:

after_filter only:[:destroy, :kerplode] { method2_namey_name(p1, p2) }
cb24
fuente
5

Puede pasar una lambda al before_actiony pasar params[:action]al set_supportmétodo de esta manera:

class SupportsController < ApplicationController
  before_action only: [:show, :edit, :update, :destroy] {|c| c.set_support params[:action]}
  ....

A continuación, se envía el parámetro es una de las cadenas: 'show', 'edit', 'update'o 'destroy'.

tihom
fuente
2
Intenté que esta sintaxis funcionara, pero no pude. La sintaxis que usó Kyle funcionó para mí.
J3RN
esta sintaxis no funciona
Prime
0

El controlador de soportes

class SupportsController < ApplicationController    
  before_action only: [:show, :edit, :update, :destroy] { |ctrl|
    ctrl.set_support("the_value")
  }
...

El ApplicationController

class ApplicationController < ActionController
  def set_support (value = "")
    p value
  end
...
Darlan D.
fuente