如何修复Rails中GraphQL突变的Lint/Syntax: unexpected token tRPAREN错误?
修复Rails GraphQL突变中的RuboCop语法错误
我来帮你搞定这个语法问题!你遇到的是Ruby中lambda与方法参数结合时的语法优先级和写法规范问题,下面是具体的解决方案和解释:
正确代码写法
你可以选择以下几种符合语法规范的写法来解决问题:
写法1:使用标准lambda语法(带大括号)
resolve(Auth.protect(lambda { |_obj, inputs, ctx| current_user = ctx[:current_user] if current_user.update(inputs.to_params) { user: current_user } else { messages: current_user.fields_errors } end }))
写法2:使用更简洁的stabby lambda(箭头lambda)
resolve(Auth.protect ->(_obj, inputs, ctx) { current_user = ctx[:current_user] if current_user.update(inputs.to_params) { user: current_user } else { messages: current_user.fields_errors } end })
写法3:去掉resolve的括号,使用do...end块
resolve Auth.protect do |_obj, inputs, ctx| current_user = ctx[:current_user] if current_user.update(inputs.to_params) { user: current_user } else { messages: current_user.fields_errors } end end
错误原因解释
你原来的代码出现语法错误有两个核心原因:
- lambda写法不规范:Ruby中lambda的标准写法是
lambda { |参数| 代码块 }或者->(参数) { 代码块 },你写的lambda (_obj, inputs, ctx) do不符合Ruby的语法规则,导致解析失败。 - 方法参数与do...end的优先级问题:当使用
do...end作为方法参数时,Ruby的语法优先级会让它默认绑定到最外层的方法(也就是resolve),而不是Auth.protect,这就导致了括号匹配错误和语法解析异常。
以上几种写法都能符合RuboCop的语法规范,同时正常实现你的GraphQL突变逻辑,你可以根据自己的编码习惯选择其中一种。
内容的提问来源于stack exchange,提问作者Jake
相关产品推荐
相关产品推荐

