Rails 4 przed zadziałaniem przekazują parametry do wywołanej metody

84

Mam następujący kod:

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

Czy jest możliwe przekazanie ciągu znaków do metody, set_supportktóra ma być zastosowana dla wszystkich 4 metod widoku? Czy można przekazać do metody inny ciąg znaków set_supportdla każdej metody w widoku?

Parsa
źródło

Odpowiedzi:

161
before_action only: [:show, :edit, :update, :destroy] do
  set_support("value")
end
Linus Oleander
źródło
6
Łącząc @tihom i tę odpowiedź, można uzyskać coś takiego before_action only: [:show, :edit, :update, :destroy] do |c| c.set_support(params[:action) end
zarazki12
Proponuję jeden ciąg, taki jak: before_action {| action | action.update_user_balance (10000)}, gdzie update_user_balance to metoda modelowa, która pobiera parametry: def update_user_balance (arg) ... end
mmike
1
Działa to dobrze z dłuższymi metodami, w przeciwnym razie użyłbym odpowiedzi przesłanej przez Kyle Decot poniżej.
jkwok
52

Możesz użyć lambdy:

class SupportsController < ApplicationController
  before_action -> { set_support("value") }, 
    only: [:show, :edit, :update, :destroy]
  ...
Kyle Decot
źródło
10

Krótka i jednowierszowa odpowiedź (którą osobiście preferuję w przypadku połączeń zwrotnych ) to:

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

Inny przykład:

after_filter only:[:destroy, :kerplode] { method2_namey_name(p1, p2) }
cb24
źródło
5

Możesz przekazać lambdę do before_actioni przekazać params[:action]do set_supportmetody w następujący sposób:

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

Następnie param wysyłany jest jednym z ciągów: 'show', 'edit', 'update'lub 'destroy'.

tihom
źródło
2
Próbowałem uruchomić tę składnię, ale nie mogłem. U mnie zadziałała składnia, której użył Kyle.
J3RN
ta składnia nie działa
Prime
0

Plik SupportsController

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

ApplicationController

class ApplicationController < ActionController
  def set_support (value = "")
    p value
  end
...
Darlan D.
źródło