Как отобразить поле формы, роль которого имеет тип enum и хранится в базе данных как целое число.Пользователь не может изменить роль - PullRequest
0 голосов
/ 07 декабря 2018

Моя роль профиля создается, и когда пользователь регистрируется в представлении действия редактирования контроллера профиля.Я хочу показать роль, назначенную пользователю в действии редактирования, и пользователь не может изменить роль.Мой 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>

Ответы [ 3 ]

0 голосов
/ 07 декабря 2018

Вы можете просто показать его как обычный текст, например:

...

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

...
0 голосов
/ 07 декабря 2018

Самый простой возможный способ - просто использовать String#humanize от ActiveSupport.

Использование заглавных букв в первом слове, превращение подчеркиваний в пробелы и (по умолчанию) удаление завершающего символа«_id», если присутствует.Как и titleize, это предназначено для создания симпатичного вывода.

irb(main):008:0> roles.roles.keys.map(&:humanize)
=> ["User", "Vip", "Admin"]
irb(main):009:0> Profile.new(role: :admin).role.humanize
=> "Admin"

Profile.roles дает нам отображение хеш-функции для Enum.

Вы можете использовать это для генерации тега selectс помощью:

<%= form.select :role, Profile.roles.keys.map{|k| [k.humanize, k] } %>

Вы можете получить "vip" .humanize для возврата "VIP", настроив перегиб:

# config/initializers/inflections.rb
ActiveSupport::Inflector.inflections(:en) do |inflect|
  inflect.acronym 'VIP'
end

Для этого может потребоваться перезапустить сервер Rails, прежде чем он заработает.

Использование модуля I18n

Но если вам нужно более гибкое решение, которое позволяет вам самостоятельно настраивать сопоставления (и работать с переводами), используйте модуль 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 %>
0 голосов
/ 07 декабря 2018

Вы можете использовать вспомогательный метод, например, в application_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 %>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...