You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在rails_admin调用中添加参数?解决ArgumentError参数错误

解决Rails Admin中ArgumentError(参数数量不匹配)的问题

这个问题我之前也碰到过!核心原因是Rails Admin会自动尝试调用模型的name方法(作为默认显示字段),但你的name方法要求必须传language参数,无参调用自然就抛出wrong number of arguments (given 0, expected 1)错误了。给你几个靠谱的解决办法:

方法一:给name方法添加默认参数

最简单的方式是给name方法设置一个默认参数,比如用系统当前的国际化语言,这样既保留了带参数调用的灵活性,又能支持Rails Admin的无参调用:

def name(language = I18n.locale)
  translation(language).try(:name)
end

protected
def translation(language)
  translate_locations.where(language: language).first
end

这样当Rails Admin无参调用name时,会自动使用I18n.locale对应的语言版本,不会再报错。

方法二:在Rails Admin中自定义显示字段

如果你不想修改模型的name方法,可以在Rails Admin的配置里直接指定要显示的内容,绕过默认的name调用:
打开config/initializers/rails_admin.rb,找到Location模型的配置部分,添加自定义字段:

config.model 'Location' do
  # 列表页配置
  list do
    # 替换默认的name字段,自定义显示逻辑
    field :translated_name do
      label 'Name' # 显示在页面上的字段名称
      formatted_value do
        # 这里可以指定固定语言,比如:en,或者用I18n.locale取当前语言
        bindings[:object].name(:en)
      end
    end
    # 保留你需要展示的其他字段
    field :created_at
    field :updated_at
  end

  # 详情页配置
  show do
    field :translated_name do
      label 'Name'
      formatted_value do
        bindings[:object].name(I18n.locale)
      end
    end
    # 其他详情字段...
  end

  # 编辑页如果不需要显示这个计算字段,可以不用修改
end

这样Rails Admin会使用我们自定义的translated_name字段展示内容,不会再触发无参调用name的问题。

方法三:改用成熟的多语言gem(长期方案)

如果你的应用有多语言需求,推荐使用globalize或mobility这类专门处理多语言的gem,它们和Rails Admin的兼容性更好,能避免这类自定义方法带来的冲突,还能简化多语言数据的管理逻辑。

内容的提问来源于stack exchange,提问作者Nino Treyssat-Vincent

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:38:20