ruby-on-rails - Rubocop 在 Rails 中的蓝图序列化程序自定义字段中警告

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

field :score_details do |user|
  user.score_details
end

你可以看到这个 block 的 Rubocop 警告,我不能让它消失。我阅读了 Rubocop 文档:SymbolProc但没有成功..

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

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

class User < ApplicationRecord
  include UserScoresConcern
end

这是我的担忧:

module UserScoresConcern
  extend ActiveSupport::Concern

  included do
    def score_details
      # this method return 45 for example
      calculate_user_score_details
    end
  end
end

我该怎么做才能修复此警告?有没有人遇到过同样的问题?

谢谢?

最佳答案

field 方法采用一个 block ,该 block 将使用 2 个参数调用,objectlocal_options。 See BlockExtractor#extract

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

field :score_details do |user,_| 
  user.score_details
end

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

另一种确定方法是使用 2 个参数调用 block 的方法是使用 lambda 代替

field :score_details, &->(user) {user.score_details}

这将导致 ArgumentError(错误数量的参数(给定 2,预期 1)),因为 lambda 只需要 1 个参数但传入了 2 个参数。这是其中之一标准 Proc 和 lambda(一种“特殊”类型的 Proc)之间的明显区别。

您遇到的错误 Commented Here “错误数量的参数(给定 1,预期 0)” 可以很容易地重新创建以显示实际发生的情况

def example
  yield "10",2
end 

example(&:to_s)
ArgumentError (wrong number of arguments (given 1, expected 0))

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

关于ruby-on-rails - Rubocop 在 Rails 中的蓝图序列化程序自定义字段中警告 SymbolProc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69104329/

相关文章:

python - 根据列表字典python的输入获取名称

snowflake-cloud-data-platform - 使用 Google 作为身份提供商

git - 如何创建自定义 git/bash 脚本?

c# - 如何按值列表分组,然后计算每个值的条目数量

Go - 如何子类型化包装错误类?

go - 在 golang 中将 []*string 转换为 []string

c++ - 如何区分ascii值和数字?

javascript - JS : proper way of using optional cha

visual-studio-code - 如何在 VS Code 中按字母顺序排列纯文本列表?

python - subprocess.call() 和 os.system() 之间的速度差异