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?

Respuestas:


161
before_action only: [:show, :edit, :update, :destroy] do
  set_support("value")
end

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]
  ...

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) }

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'.


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
...
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.