ruby-on-rails :id和id之间的区别是什么:还有Ruby的身份证

c90pui9n  于 2023-01-22  发布在  Ruby
关注(0)|答案(1)|浏览(123)

我正在尝试构建一个ruby on rails和graphQL应用程序,并且正在进行用户更新突变,我花了很长时间试图弄清楚,当我不小心打错字时,它突然起作用了。
以下是工作迁移:

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以外的所有变量,它们都使用相同的语法冒号after。由于某种原因,当我使用id:时,它解析为字符串“id”,而使用冒号first :id则返回未定义的错误。
只有当我不小心删除了冒号,并尝试id时,它才真正解析为传递的值。
我对此的问题是,为什么以及如何这样做?我试图在文档中找到答案,并阅读其他帖子,但一直无法找到答案。
请有人帮助我的大脑绕过这一点,来自PHP背景,Ruby是融化我的大脑。

tktrz96b

tktrz96b1#

这将需要一些时间来适应Ruby,来自PHP,但它不会太糟糕。
本质上id是一个变量,或者像model_instance.id一样使用时是一个对象/模型属性,在PHP中类似于$id$object_instance->id
当您看到id:时,它是键-值对中的键,因此它需要一些东西(一个值)在它之后(或者如果没有任何结果则假定nil,通常在使用关键字参数的方法定义中,如您的示例)。一个典型的用法可能是model_instance.update(id: 25),其中您实际上是将一个哈希值传递给update方法,其中id作为键,25作为值。在Ruby中,更古老的写法是使用“hash rocket”,如下所示:model_instance.update(:id => 25).
更多关于Ruby散列的阅读:https://www.rubyguides.com/2020/05/ruby-hash-methods
更多关于关键字参数的阅读:https://www.rubyguides.com/2018/06/rubys-method-arguments
现在如果你注意的话,hash rocket现在使用了你所问的第三种类型,当你看到像这样的字符串前面有一个冒号时,它被称为“符号”,你需要一些时间来适应它们,但它们本质上是Ruby中的字符串,定义起来少了一个字符(并且不可变)。Ruby的人们通常喜欢使用:id作为符号,而不是使用'id'"id"作为字符串,并且它通常会在需要时自动转换为字符串。一个很好的例子可能是排序的枚举器。

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

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

相关问题