Как "only:" в "before_action" работает в Rails?

После генерации скаффолдов мы обычно получаем следующую строку:

before_action :set_newsletter_email, only: [:show, :edit, :update, :destroy]

Может ли кто-нибудь объяснить мне, как именно работает этот символ only:?

Ответ 1

only вариант before_action определяет одно действие или список действий, когда сначала выполняется метод/блок.

Пример:

# defined actions: [:show, :edit, :update, :destroy]
before_action :set_newsletter_email, only: [:show, :edit]

Метод set_newsletter_email будет вызван непосредственно перед действиями show и edit.


Противоположная опция, except определения, когда NOT выполнить метод/блок.

# defined actions: [:show, :edit, :update, :destroy]
before_action :set_newsletter_email, except: [:show, :edit]

Метод set_newsletter_email будет вызываться для всех существующих действий EXCEPT, show и edit.


only/except - это просто белый список/черный список.

Ответ 2

Вариант :only в этом примере выполняется :only метод: set_newsletter_email, когда любое действие, определенное в списке в квадратных скобках [:show, :edit, :update, :destroy] ,: edit,: update,: [:show, :edit, :update, :destroy] вызывается в текущем контроллере и выполняется до действия выполняются. Любые другие действия, определенные в контроллере, не будут выполняться :set_newsletter_email.

Вы также можете сделать противоположное :except опции для определения метода, который будет выполняться для каждого действия, определенного в контроллере, кроме указанного в списке.

Вы также можете выполнить after_action который будет запускаться после действия в контроллере

Вы можете прочитать об фильтрах и всех вариантах здесь: http://guides.rubyonrails.org/action_controller_overview.html#filters

Ответ 3

Когда пользователь перемещается только к этим маршрутам, он :set_newsletter_email функцию :set_newsletter_email, обычно в конце этого файла контроллера.

Поэтому, когда пользователь переходит к методу индекса, он не запускает его, потому что :set_newsletter_email вызывается только для методов в скобках.

В этом случае требуется обратный вызов, потому что он устанавливает ресурс в представлениях одного ресурса перед его визуализацией.

Например:

/newsletter/2 вызовет :set_newsletter_email, который сначала получит идентификатор из параметров ссылки, а затем он будет искать ресурс и установить с ним переменную экземпляра.

Я не знаю, какова ваша забота о безопасности в этом случае, но этот обратный вызов получает только параметр id для установки ресурса, и поскольку вы используете строительные леса, он также генерирует функцию params (также в конце файла), которая белый список параметров, которые вы определили ранее, при создании эшафота.

Вы можете найти более подробную информацию здесь: http://api.rubyonrails.org/classes/AbstractController/Callbacks/ClassMethods.html

Если вы хотите, чтобы я объяснял больше или разъяснял что-то, просто спросите 👍🏼