在脚手架生成之后,我们通常得到一条这样的线:
before_action :set_newsletter_email, only: [:show, :edit, :update, :destroy]
有人可以解释一下这个only:
符号究竟是如何工作的以及它如何影响安全性的?
答案 0 :(得分:15)
only
before_action
选项定义一个操作或首先执行方法/块时的操作列表。
例如:
# defined actions: [:show, :edit, :update, :destroy]
before_action :set_newsletter_email, only: [:show, :edit]
set_newsletter_email
方法将在show
和edit
操作之前调用。
相反的选项except
定义何时不执行方法/块。
# defined actions: [:show, :edit, :update, :destroy]
before_action :set_newsletter_email, except: [:show, :edit]
除了set_newsletter_email
和show
之外,所有现有操作都会调用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
如果您希望我解释更多或澄清一些事情,请询问