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

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]}
  ....

Тоді пари відправлений одна з рядків: 'show', 'edit', 'update'або 'destroy'.


2
Я намагався змусити цей синтаксис працювати, але не зміг. Синтаксис, який використовував Кайл, спрацював для мене.
J3RN

цей синтаксис не працює
Prime

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
...
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.