2013-10-08 14 views
61

Ho il codice seguente:rotaie 4 before_action, passare parametri addotta metodo

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

'possibile passare una stringa al metodo set_support da applicare tutti i 4 metodi vista? È possibile passare una stringa diversa al metodo set_support per ciascun metodo nella vista?

risposta

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

Combinando @tihom e questa risposta si può ottenere qualcosa di simile 'before_action solo: [: spettacolo, edit,: aggiornamento,: distruggere] do | C | c.set_support (params [: action) end' – germs12

+0

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

+0

Questo funziona bene con metodi più lunghi, altrimenti userei la risposta inviata da Kyle Decot in seguito. – jkwok

3

È possibile passare un lambda al before_action e passare params[:action] al metodo set_support in questo modo:

class SupportsController < ApplicationController 
    before_action(only: [:show, :edit, :update, :destroy]) ->{|c| c.set_support params[:action]} 
    .... 
+1

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

26

È possibile utilizzare un lambda:

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

A breve e one risposta di linea (che personalmente preferisco per le chiamate ) è:

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

Un altro esempio:

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