ActiveAdmin 集合名称

ActiveAdmin Collection Names

我的模型中有一系列角色:

ROLES = ['super_admin', 'user', 'user_admin']

我有一个显示这些角色的 ActiveAdmin 表单:

input :roles, as: :check_boxes, collection: User::ROLES

我必须在表格中将角色显示为人性化的大写名称,而不是蛇形:

Super Admin, Salesman, Sales Admin

但是当其中之一被选中时,它必须保存在snakecase中。

我试过这个:

User::ROLES
.map { |r| "#{r.humanize}" }
.map { |r| r.split.map(&:capitalize).join(' ') }

但这将角色保存为人性化的大写形式,而不是蛇形形式。如何在表格中使用人性化大写版本的单词,但保存蛇形版本?

您可以使用 Rails(主动支持) 方法 String#titleize 而不是 split.map(&:capitalize).join(' ')

如果你想将记录存储在数据库中作为 snakecase 你可以通过以下方式进行:在下拉选项中它将显示为 titalize 但它的值将设置为 snakecase将存储在数据库中。

> roles.map{|e|[e.titleize, e]}
#=> [["Super Admin", "super_admin"], ["User", "user"], ["User Admin", "user_admin"]]

在 activeadmin 中使用:

input :roles, as: :check_boxes, collection: User::ROLES.map{|e|[e.titleize, e]}

如果您想使用纯 Ruby,一种替代方法是:

'super_admin'.split('_').map(&:capitalize).join(' ')
#=> "Super Admin"

所以,映射你的数组:

roles.map { |str| [str.split('_').map(&:capitalize).join(' '), str] }
#=> [["Super Admin", "super_admin"], ["User", "user"], ["User Admin", "user_admin"]]

向后(before_save):

"Super Admin".downcase.gsub(' ', '_') #=> "super_admin"