红宝石中的 :id、id: 和 id 有什么区别?



我正在尝试在rails和graphQL应用程序上构建一个ruby,并且正在研究用户更新突变。我花了很长时间试图弄清楚它,当我不小心打错字时,它突然起作用了。

以下是工作迁移:

module Mutations
class UpdateUser < BaseMutation
argument :id, Int
argument :first_name, String
argument :last_name, String
argument :username, String
argument :email, String
argument :password, String
field :user, Types::User
field :errors, [String], null: false
def resolve(id:, first_name:, last_name:, username:, email:, password:)
user = User.find(id)
user.update(first_name:, last_name:, username:, email:, password:)
{ user:, errors: [] }
rescue StandardError => e
{ user: nil, errors: [e.message] }
end
end
end

我感到困惑的是,当我定义参数时,它们首先是冒号:例如:id:first_name

当我将它们传递给 resolve 方法时,它们仅在以下有冒号时才有效:例如id:first_name:

当我将变量传递给 update 方法时,它们对 ID 以外的所有变量使用相同的冒号语法。出于某种原因,当我使用id:它解析为字符串"id"时,首先使用冒号:id返回一个未定义的错误。

只有当我不小心删除了冒号并尝试id时,它才真正解析为传递的值。

我的问题是,为什么以及如何以这种方式行事?我尝试在文档中找到答案,并阅读其他帖子,但无法找到答案。

请有人帮助我的大脑解决这个问题,来自PHP背景,Ruby正在融化我的大脑。

需要一些时间来适应来自PHP的Ruby,但它不会太糟糕。

本质上,id是一个变量,或者像model_instance.id一样使用时的对象/模型属性。在PHP中,这就像$id$object_instance->id

当您看到id:它是键值对中的键时,因此它期望在其之后的某些内容(值)(或者假设nil如果没有后续内容,通常在使用关键字参数的方法定义中,例如您的示例)。典型的用法可能是model_instance.update(id: 25),实质上是将哈希传递给update方法,id作为键,25作为值。在 Ruby 中编写此内容的旧方法是使用"哈希火箭",如下所示:model_instance.update(:id => 25).
更多关于 Ruby 哈希的阅读: https://www.rubyguides.com/2020/05/ruby-hash-methods
更多关于关键字参数的阅读: https://www.rubyguides.com/2018/06/rubys-method-arguments

现在,如果您注意哈希火箭现在使用您要询问的第 3 种类型。当你看到这样的字符串前面有一个冒号时,它被称为"符号",需要一些时间来适应它们,但它们本质上是 Ruby 中的字符串,定义起来少一个字符(并且不可变)。Ruby 用户通常喜欢使用:id作为符号,而不是使用'id'"id"作为字符串,它通常会在需要时自动转换为字符串。一个很好的例子可能是各种枚举器。

state = :ready
if state == :ready
state = :finished
else
state = :undefined
end

更多关于红宝石符号的阅读:https://www.rubyguides.com/2018/02/ruby-symbols

最新更新