Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何显示角色为enum数据类型且在数据库中存储为整数的表单字段。用户可以';不要改变角色_Ruby On Rails_Ruby - Fatal编程技术网

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 %>