如何在Rails Admin中根据条件动态切换字段:下拉框/文本框
解决方案
你的问题出在误用了formatted_value方法——这个回调是用来格式化字段的展示值(比如列表页、详情页的显示),而不是用来定义编辑页面的输入控件类型的,所以你设置的enum会被全局应用到所有value字段,导致全部显示下拉。
下面是两种不需要修改视图的实现方式,都是在Rails Admin的模型配置中完成:
方法1:使用form块动态渲染控件
直接在字段配置里通过form块根据当前对象的key值渲染不同的输入控件:
#Table name: settings #key :string #value :string class Setting < ApplicationRecord rails_admin do edit do # 先显示key字段,确保用户能设置/查看key值 field :key field :value do form do |f| # 根据当前对象的key值选择输入控件 if bindings[:object].key == "test" f.input :value, as: :select, collection: ['option1', 'option2'] else f.input :value, as: :string end end end end end end
方法2:动态设置input_type和collection
通过重写字段的input_type方法来动态决定输入类型,同时配合collection方法提供下拉选项:
class Setting < ApplicationRecord rails_admin do edit do field :key field :value do # 动态返回输入类型:key为test时用select,否则用string def input_type # 用&.避免新建对象时bindings[:object]为nil的情况 bindings[:object]&.key == "test" ? :select : :string end # 仅当key为test时提供下拉选项 def collection ['option1', 'option2'] if bindings[:object]&.key == "test" end end end end end
注意事项
- 新建
Setting记录时,因为key还未设置,会默认显示单行文本框;当你保存key为test的记录后,再次编辑时就会显示下拉列表。 - 如果需要在用户修改
key时实时切换输入控件(不需要刷新页面),那必须添加前端JS逻辑,但这会涉及修改视图,不符合你的需求,所以上面的方案是纯后端配置的最优解。
内容的提问来源于stack exchange,提问作者Данил
相关产品推荐
相关产品推荐

