如何在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
相关产品推荐
相关产品推荐

