Rob*_*ert 4 ruby ruby-on-rails
我假设其中很多是内置的或对流的,但是belongs_to 或require 之类的方法使用一个符号作为它作为参数的模型名称。
当涉及到 before_action 之类的方法时,我不确定为什么在控制器操作前面有一个符号,如下方括号中所示。
before_action :find_course, only: [:show, :edit, :update, :destroy]
Run Code Online (Sandbox Code Playgroud)
是所有这些符号都用作散列的键还是大多数方法都将符号作为其参数?
第二个。大多数方法将符号作为它们的参数。原因如下:何时在 Ruby 中使用符号而不是字符串?
这是 的方法签名before_action:
before_action(names, options)
Run Code Online (Sandbox Code Playgroud)
如您所见,它首先将 aname和一些选项作为参数。按照惯例,options是一个散列。由于 Ruby 允许您删除大量“行噪声”,因此散列周围的括号是隐式的。您可以编写与以下相同的行:
before_action(:find_course, { only: [:show, :edit, :update, :destroy] })
Run Code Online (Sandbox Code Playgroud)
所以:find_course不是散列的关键,而是only。
此外,:find_course不是模型的名称,而是方法的名称。通过将方法名称(作为符号)传递给before_action,该方法将在处理每个请求之前#show(例如之前)执行。通过options,可以将操作限制为某些操作。它们再次作为符号提供,因为它们是内部标识符。从技术上讲,它们都再次引用了控制器上的方法。
传递引用方法或类的符号是 Rails 中非常常见的做法。belongs_to使用相同的约定将关联方法添加到您的模型 ( belongs_to :user)。Rails 将尝试将此方法名称连接到调用的模型,User除非您另行指定。这是Rails神奇之处的一部分,它使它非常易于使用,但一开始有点难以理解。
对 Ruby 和符号 vs. 字符串有一个很好的理解可以帮助你更好地理解这一点。
编辑:
要了解“内部标识符”的含义,请查看 Deep 在对您的问题的评论中链接到的问题:Why do callbacks use symbols in Ruby on Rails它解释了为什么您需要引用方法,而不是执行以下操作:
before_action(find_course)
Run Code Online (Sandbox Code Playgroud)
总之,这将执行find_course并将其结果传递给before_action,这不是您想要的。所以你需要以某种方式引用该方法,以便以后可以调用它。
在其他语言中,这可以通过字符串或传入函数对象来完成。例如,在 Python 中你可以做一些事情before_action(print)。这将传递对函数的引用而不调用它。遗憾的是,这在 Ruby 中是不可能的,所以我们需要传入一个带有方法名称的字符串或符号,这让我们回到第一个链接问题,即符号作为引用优于字符串的好处。
| 归档时间: |
|
| 查看次数: |
1285 次 |
| 最近记录: |