Rails 4 before_action、呼び出されたメソッドにパラメーターを渡します


84

私は次のコードを持っています:

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

set_support4つのビューメソッドすべてに適用されるメソッドに文字列を渡すことは可能ですか?set_supportビュー内のメソッドごとに異なる文字列をメソッドに渡すことは可能ですか?

回答:


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

6
@tihomとこの応答を組み合わせると、次のようなものが得られます before_action only: [:show, :edit, :update, :destroy] do |c| c.set_support(params[:action) end
— Germs12 2014年

次のような1つの文字列をお勧めします:before_action {| action | action.update_user_balance(10000)}、ここでupdate_user_balanceは、パラメーターを取得するモデルメソッドです。defupdate_user_balance(arg)... end
— mmike 2016

1
これは、より長い方法でうまく機能します。そうでない場合は、以下のKyleDecotによって提出された回答を使用します。
— jkwok 2017

52

ラムダを使用できます:

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

10

短くてワンライナーの答え(私は個人的にコールバックに好む)は次のとおりです。

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

もう一つの例:

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

5

あなたはにラムダを渡すことができますbefore_actionし、合格params[:action]にset_supportこのような方法:

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

そして、送信されているparamが文字列のいずれかである:'show'、'edit'、'update'または'destroy'。


2
この構文を機能させようとしましたが、機能しませんでした。カイルが使用した構文は私のために働いた。
— J3RN 2016

この構文は機能しません
— プライム

0

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
...
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.