Rails 4 before_action, passa i parametri al metodo invocato


84

Ho il codice seguente:

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

È possibile passare una stringa al metodo set_supportda applicare a tutti e 4 i metodi di visualizzazione? È possibile passare una stringa diversa al metodo set_supportper ogni metodo nella vista?

Risposte:


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

6
Combinando @tihom e questa risposta puoi ottenere qualcosa del genere before_action only: [:show, :edit, :update, :destroy] do |c| c.set_support(params[:action) end
germs12

Suggerisco una stringa come: before_action {| action | action.update_user_balance (10000)}, dove update_user_balance è un metodo modello che ottiene i parametri: def update_user_balance (arg) ... end
mmike

1
Funziona bene con metodi più lunghi, altrimenti userei la risposta fornita da Kyle Decot di seguito.
jkwok

52

Puoi usare un lambda:

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

10

Una risposta breve e di una riga (che personalmente preferisco per i callback ) è:

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

Un altro esempio:

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

5

Puoi passare un lambda a before_actione passare params[:action]al set_supportmetodo in questo modo:

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

Poi il param essere inviato è una delle stringhe: 'show', 'edit', 'update'o 'destroy'.


2
Ho provato a far funzionare questa sintassi, ma non ci sono riuscito. La sintassi usata da Kyle ha funzionato per me.
J3RN

0

Il SupportsController

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

Il ApplicationController

class ApplicationController < ActionController
  def set_support (value = "")
    p value
  end
...
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.