Rails 4 before_action übergibt Parameter an die aufgerufene Methode

81

Ich habe folgenden Code:

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

Ist es möglich, eine Zeichenfolge an die Methode set_supportzu übergeben, die für alle 4 Ansichtsmethoden angewendet werden soll? Ist es möglich, set_supportfür jede Methode in der Ansicht eine andere Zeichenfolge an die Methode zu übergeben?

Parsa
quelle

Antworten:

153
before_action only: [:show, :edit, :update, :destroy] do
  set_support("value")
end
Linus Oleander
quelle
5
Wenn Sie @tihom und diese Antwort kombinieren, können Sie so etwas bekommen before_action only: [:show, :edit, :update, :destroy] do |c| c.set_support(params[:action) end
Germs12
Ich schlage eine Zeichenfolge vor: before_action {| action | action.update_user_balance (10000)}, wobei update_user_balance eine Modellmethode ist, die Parameter abruft: def update_user_balance (arg) ... end
mmike
1
Dies funktioniert gut mit längeren Methoden, andernfalls würde ich die Antwort von Kyle Decot unten verwenden.
JKWOK
49

Sie können ein Lambda verwenden:

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

Eine kurze und einzeilige Antwort (die ich persönlich für Rückrufe bevorzuge ) lautet:

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

Ein anderes Beispiel:

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

Sie können ein Lambda an die übergeben before_actionund params[:action]an die set_supportMethode wie folgt übergeben:

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

Dann sendet die param zu sein , ist eine der Saiten: 'show', 'edit', 'update'oder 'destroy'.

tihom
quelle
1
Ich habe versucht, diese Syntax zum Laufen zu bringen, konnte es aber nicht. Die Syntax, die Kyle verwendet hat, hat bei mir funktioniert.
J3RN
0

Der SupportsController

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

Der ApplicationController

class ApplicationController < ActionController
  def set_support (value = "")
    p value
  end
...
Darlan Dieterich
quelle