何时在Rails中使用符号?

时间:2017-07-25 06:38:04

标签: ruby-on-rails ruby

我假设很多这些是内置的或者是对话的,但是像belongs_to或者require这样的方法使用一个符号作为参数的模型名称。

当谈到像before_action这样的方法时,我不确定为什么在控制器动作前面有一个符号,如下面的括号所示。

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

所有这些符号都是用作哈希的键还是大多数方法都将符号作为参数?

2 个答案:

答案 0 :(得分:4)

第二个。大多数方法都将符号作为参数。原因如下:When to use symbols instead of strings in Ruby?

这是before_action

的方法签名
before_action(names, options)

如您所见,首先需要name,然后选择一些选项作为参数。按照惯例,options是哈希。因为Ruby允许你丢弃很多"线路噪声",哈希周围的括号是隐含的。您可以写相同的行:

before_action(:find_course, { only: [:show, :edit, :update, :destroy] })

因此:find_course不是哈希的关键,但only是。

此外,:find_course不是模型的名称,而是方法的名称。通过将方法名称(作为符号)传递给before_action,该方法将在处理每个请求之前执行(例如,在#show之前)。通过options,可以将操作限制为某些操作。它们再次作为符号提供,因为它们是内部标识符。从技术上讲,它们都会再次参考控制器上的方法。

传递引用方法或类的符号是Rails中非常常见的做法。 belongs_to使用相同的约定向模型添加关联方法(belongs_to :user)。除非另行指定,否则Rails将尝试将此方法名称连接到名为User的模型。这是Rails的 magic 的一部分,它使它非常易于使用,但在开始时有点难以理解。

充分了解Ruby以及符号与字符串有助于您更好地理解这一点。

编辑:

了解"内部标识符"表示在问题评论中查看与Deep相关联的问题:Why do callbacks use symbols in Ruby on Rails它解释了为什么您需要引用某个方法,而不是执行以下操作:

before_action(find_course)

总之,这会执行find_course并将其结果传递给before_action,这不是您想要的。因此,您需要以某种方式引用方法,以便稍后调用它。

在其他语言中,这可以通过字符串或传入函数对象来完成。例如,在Python中,您可以执行before_action(print)。这将传递对函数的引用而不调用它。遗憾的是,这在Ruby中是不可能的,因此我们需要传入一个带有方法名称的字符串或符号,这将我们带回到关于字符串作为引用的符号优点的第一个链接问题。

答案 1 :(得分:-3)

符号可以是很多东西:变量,动作,实体,对象,列,所以它几乎是不可能的......它是...的等价物。"因为它可以是许多语言中很多东西的等价物。

这个link here会告诉你符号既是字符串又是整数表示,这就是为什么你可以:symbol.to_s获取字符串值或:symbol.to_i得到它的整数值。

我希望这有帮助,我也学习了红宝石的基础知识,所以我正在谈论我分享的链接和我的经验