Ruby on rails 如何显示角色为enum数据类型且在数据库中存储为整数的表单字段。用户可以';不要改变角色
将创建我的配置文件角色,并在用户登录配置文件控制器的编辑操作视图时显示。我想显示在编辑操作中分配给用户的角色,用户无法更改该角色。我的Ruby on rails 如何显示角色为enum数据类型且在数据库中存储为整数的表单字段。用户可以';不要改变角色,ruby-on-rails,ruby,Ruby On Rails,Ruby,将创建我的配置文件角色,并在用户登录配置文件控制器的编辑操作视图时显示。我想显示在编辑操作中分配给用户的角色,用户无法更改该角色。我的edit.html.erb文件如下所示: <div class="row"> <div class="col-md-6 offset-md-3"> <h3>Profile</h3> <%= form_for(@profile) do |f| %> <div c
edit.html.erb
文件如下所示:
<div class="row">
<div class="col-md-6 offset-md-3">
<h3>Profile</h3>
<%= form_for(@profile) do |f| %>
<div class="form-group">
<%= f.label :first_name %><br />
<%= f.email_field :first_name, autofocus: true, class: "form-control"%>
</div>
<div class="form-group">
<%= f.label :last_name %><br />
<%= f.password_field :last_name, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :role %><br />
<%= f.select(:role, [['User', 'user'], ['Vip', 'vip'], ['Admin', 'admin']]) %>
</div>
<div class="actions form-group">
<%= f.submit "Submit", class: 'btn btn-primary' %>
</div>
<% end %>
</div>
轮廓
您可以使用助手方法,例如在
应用程序\u helper.rb
中,您可以创建如下方法:
class ApplicationHelper
def profile_role(profile)
# Perform your logic
# if you are using as_enum gem for example
Profile.roles.select{|symbol_role,integer_rep| integer_rep == profile.role}.keys.first.to_s
# of course there could be much better way to get the string.
end
end
然后在您看来,如果用户不能更改它,则无需将其设置为下拉列表:
<div class="row">
<div class="col-md-6 offset-md-3">
<h3>Profile</h3>
<%= form_for(@profile) do |f| %>
<div class="form-group">
<%= f.label :first_name %><br />
<%= f.email_field :first_name, autofocus: true, class: "form-control"%>
</div>
<div class="form-group">
<%= f.label :last_name %><br />
<%= f.password_field :last_name, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :role %><br />
<%= text_field_tag 'role', profile_role(@profile), disabled: true %>
</div>
<div class="actions form-group">
<%= f.submit "Submit", class: 'btn btn-primary' %>
</div>
<% end %>
轮廓
您可以将其显示为常规文本,例如:
...
<div class="form-group">
<%= f.label :last_name %><br />
<%= f.password_field :last_name, class: "form-control" %>
</div>
<p>
Role:<br />
<%= @profile.role %>
</div>
<div class="actions form-group">
<%= f.submit "Submit", class: 'btn btn-primary' %>
</div>
...
。。。
角色:
...
最简单的方法就是使用ActiveSupport
将第一个单词大写,将下划线变为空格,以及(按
默认设置)如果存在,则删除尾随的“\u id”。像蒂特莱泽一样,这是
用于创建漂亮的输出
Profile.roles
为我们提供枚举的哈希映射
您可以使用此选项生成具有以下内容的select标记:
<%= form.select :role, Profile.roles.keys.map{|k| [k.humanize, k] } %>
这可能需要在Rails服务器启动之前重新启动它
使用I18n模块
但是,如果您想要一个更灵活的解决方案,让您自己设置映射(并使用翻译),请使用:
然后,您将通过以下方式显示用户角色:
<%= translate_role(@user.role) %>
您可以将表单输入设置为:
<%= form.select :role, role_options %>
您能展示一下您的用户模型吗?当然可以。我使用了Deviate for user。您的profile_role方法很有创意,但毫无意义,因为您可以在实例上调用#role
,以获取枚举列的值(作为字符串)<代码>配置文件.new(role::admin).role=='admin'.Ahaa,我使用的是旧的rails,我不知道ActiveRecord中确实存在这个,好的和新的信息,Thank.Thank lot@max.我在创建枚举的同一模型中创建了一个散列,然后迭代该散列,该散列的值是枚举角色的键,该角色反过来设置我的枚举值。我仍然会使用I18n
解决方案,因为显示不是模型问题。
# config/locales/en.yml
en:
activerecord:
attributes:
profile:
roles:
user: 'User'
vip: 'Very Important Person'
admin: 'Admin'
# app/helpers/users_helper.rb
module UsersHelper
def translate_role(role)
I18n.t("activerecord.attributes.user.roles.#{ role }", default: role.humanize)
end
def role_options
Profile.roles.keys.map{|k| [translate_role(k), k] }
end
end
<%= translate_role(@user.role) %>
<%= form.select :role, role_options %>