Rails 中的蓝打印机序列化器自定义字段中的 Rubocop 警告 SymbolProc

fra*_*lps 2 ruby serialization ruby-on-rails rubocop

我有一个带有自定义字段的 Blueprinter 序列化程序(参见屏幕截图)

在此输入图像描述

field :score_details do |user|
  user.score_details
end
Run Code Online (Sandbox Code Playgroud)

你可以看到这个区块的 Rubocop 警告,但我无法让它消失。我读了 Rubocop 文档:SymbolProc但没有成功..

详细解释一下:我有一个用户模型,其中包含一个问题以计算分数。在这个问题上,我有 1 个方法(没有参数)返回一个简单的整数。最后,我在我的中使用此方法UserSerializer,以便将我的分数呈现到我的前端。

这是我在我的用户模型中的包含内容:

field :score_details do |user|
  user.score_details
end
Run Code Online (Sandbox Code Playgroud)

这是我的担忧:

class User < ApplicationRecord
  include UserScoresConcern
end
Run Code Online (Sandbox Code Playgroud)

我可以做什么来解决这个警告?有人遇到过同样的问题吗?

谢谢

eng*_*nky 6

field方法采用一个块,该块将使用 2 个参数 theobject和 the进行调用local_optionsBlockExtractor#extract

您的问题是您的块忽略了提供了 2 个参数的事实,因此 Rubocop 认为您可以使用Symbol#to_proc(因为它认为只有一个参数发送到块);但是,如果您承认第二个参数,则此警告将会消失。

field :score_details do |user,_| 
  user.score_details
end
Run Code Online (Sandbox Code Playgroud)

在这里,我们使用下划线字符确认第二个参数_。这是一个标准约定,表明我们不打算使用这个参数。

确定方法的另一种方法是使用 2 个参数调用块,即使用 lambda

field :score_details, &->(user) {user.score_details}
Run Code Online (Sandbox Code Playgroud)

这将导致ArgumentError (wrong number of arguments (given 2, expected 1))因为 lambda 只期望 1 个参数,但传入了 2 个参数。这是标准Proc和 lambda(这是 的“特殊”类型Proc)之间的明显区别之一。

您在此处评论 的错误“参数数量错误(给定 1,预期 0)”可以轻松重新创建以显示实际发生的情况

def example
  yield "10",2
end 

example(&:to_s)
ArgumentError (wrong number of arguments (given 1, expected 0))
Run Code Online (Sandbox Code Playgroud)

这是因为在这种情况下使用时Symbol#to_proc,它将评估为"10".to_s(2)String#to_s不接受任何参数,从而User#score_details导致user.score_details(local_options)以相同的方式失败。