Rails 4 before_action, передать параметры вызываемому методу

84

У меня такой код:

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

Можно ли передать строку методу, set_supportкоторый будет применяться для всех 4 методов просмотра? Можно ли передать методу другую строку 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
Я предлагаю одну строку вроде: before_action {| action | action.update_user_balance (10000)}, где update_user_balance - это модельный метод, который получает параметры: def update_user_balance (arg) ... end
mmike
1
Это хорошо работает с более длинными методами, иначе я бы использовал ответ, представленный Кайлом Декотом ниже.
jkwok 08
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) }
cb24
источник
5

Вы можете передать лямбда в метод before_actionи передать params[:action]его set_supportтак:

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

Тогда пары отправленный одна из строк: 'show', 'edit', 'update'или 'destroy'.

Тихом
источник
2
Я пытался заставить этот синтаксис работать, но не смог. Синтаксис, который использовал Кайл, мне помог.
J3RN
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
...
Дарлан Д.
источник