'before_action`中的`only:`如何在Rails中工作?

时间:2017-08-10 13:47:15

标签: ruby-on-rails security

在脚手架生成之后,我们通常得到一条这样的线:

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

有人可以解释一下这个only:符号究竟是如何工作的以及它如何影响安全性的?

3 个答案:

答案 0 :(得分:15)

only before_action选项定义一个操作或首先执行方法/块时的操作列表。

例如:

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

set_newsletter_email方法将在showedit操作之前调用。

相反的选项except定义何时不执行方法/块。

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

除了set_newsletter_emailshow之外,所有现有操作都会调用edit方法。

only / except只是一种白名单/黑名单。

答案 1 :(得分:1)

选项:only运行一种方法,':set_newsletter_email'在此示例中,当在当前控制器中调用方括号[:show, :edit, :update, :destroy]中的列表中定义的任何操作并在操作运行之前运行时。控制器中定义的任何其他操作都不会执行:set_newsletter_email方法。

您也可以使用:except选项执行相反操作,以定义将在控制器中定义的每个操作上运行的方法,但列出的操作除外。

您还可以执行将在控制器中执行操作后运行的after_action

您可以在此处阅读有关过滤器和所有选项的信息: http://guides.rubyonrails.org/action_controller_overview.html#filters

答案 2 :(得分:1)

当用户仅导航到这些路线时,它将触发:set_newsletter_email功能,通常在该控制器文件的末尾。

因此,当用户导航到索引方法时,它不会触发它,因为:set_newsletter_email仅为 调用括号中的方法。

在这种情况下需要回调,因为它在呈现之前在单个资源视图中设置资源。

例如:

/newsletter/2路由将触发首先从链接参数获取id的:set_newsletter_email,然后它将查找资源并使用它设置实例变量。

在这种情况下,我不知道你对安全性的担忧是什么,但是这个回调只获得了设置资源的id参数,并且因为你使用了支架,它也会产生一个params函数(同样在文件的结尾)在生成脚手架时将您之前定义的参数列入白名单。

您可以在此处找到更多信息:http://api.rubyonrails.org/classes/AbstractController/Callbacks/ClassMethods.html

如果您希望我解释更多或澄清一些事情,请询问