После генерации скаффолдов мы обычно получаем следующую строку:
before_action :set_newsletter_email, only: [:show, :edit, :update, :destroy]
Может ли кто-нибудь объяснить мне, как именно работает этот символ only:
?
После генерации скаффолдов мы обычно получаем следующую строку:
before_action :set_newsletter_email, only: [:show, :edit, :update, :destroy]
Может ли кто-нибудь объяснить мне, как именно работает этот символ only:
?
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
- это просто белый список/черный список.
Вариант :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
Когда пользователь перемещается только к этим маршрутам, он :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
Если вы хотите, чтобы я объяснял больше или разъяснял что-то, просто спросите 👍🏼