我假设很多这些是内置的或者是对话的,但是像belongs_to或者require这样的方法使用一个符号作为参数的模型名称。
当谈到像before_action这样的方法时,我不确定为什么在控制器动作前面有一个符号,如下面的括号所示。
before_action :find_course, only: [:show, :edit, :update, :destroy]
所有这些符号都是用作哈希的键还是大多数方法都将符号作为参数?
答案 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
得到它的整数值。
我希望这有帮助,我也学习了红宝石的基础知识,所以我正在谈论我分享的链接和我的经验