问题描述
我正在开展一个辅助项目,以学习将 GraphQL 实现到 Rails 6 应用程序中。为此,我使用了 graphql-ruby gem。
我有一个解决方法来更新一个看起来像这样的 Medium 模型:
module Mutations
module Media
class UpdateMedia < GraphQL::Schema::Mutation
include ::GraphqlAuthenticationConcerns
include ::GraphqlActiveModelConcerns
description 'Update Media'
argument :id,Integer,required: true
argument :title,String,required: false
argument :preview_url,required: false
argument :preview_image,required: false
argument :watched,Boolean,required: false
field :success,null: false
field :errors,[Types::ActiveModelError],null: false
field :media,Types::MediumType,null: false
def resolve(id:,title:,release_date:,preview_url:,preview_image:,watched:)
authenticate_user!
media = Medium.find(id)
media_params = {
title: title,preview_url: preview_url,preview_image: preview_image,watched: watched,}
if media.update(media_params)
success_response(media)
else
Failed_response(media)
end
end
private
def success_response(media)
{
success: true,errors: [],media: media
}
end
def Failed_response(media)
{
success: false,errors: errors(media)
}
end
end
end
end
如果我以这种方式设置参数并且只想更新 watched
字段,我会收到 500 错误,指出 missing keywords: :title,:release_date,:preview_url,:preview_image
。
我在 graphql-ruby 存储库中看到 this issue 来自有相同问题的人,但是他们被告知将默认值设置为 nil
,当我尝试此操作时,它当然会将每一列设置为该模型为零。
我希望能够只更改实际作为参数传递的字段,而不影响其他字段。如何同时允许必需参数 (id) 和可选参数?
解决方法
终于明白了。通过像这样定义方法:
def resolve(id:,**args)
authenticate_user!
media = Medium.find(id)
if media.update(args)
success_response(media)
else
failed_response(media)
end
end
这会根据需要保留 id
参数,并允许其他参数通过而无需将整个记录设置为 nil
。
最终更像是一个通用的 Ruby 问题,而不是特定于 graphql-ruby。