В Rails измените отображаемое значение при использовании итерации и enum? - PullRequest
0 голосов
/ 04 сентября 2018

Существует четыре возможных варианта статуса: подтвержден, ожидает, отклонен и удален. Они фактически представлены как целые числа, но модель имеет следующее:

class UTR < ApplicationRecord
 belongs_to :training_resource
 enum status: [:pending, :confirmed, :rejected, :removal]
 module SameScope
  HR = ['pending', 'confirmed', 'rejected', 'removal'].freeze
 end
end

Внешний интерфейс использует «удаление» в качестве проверки для построения своей стороны, поэтому я не хочу обновлять язык здесь. Но у нас есть форма, которая используется в бэкэнде для обновления статуса, и ее необходимо изменить с удаления на запрос на удаление.

Форма выглядит так:

<%= tb_form_for [:admin, x], url: admin_update_utr_path(x), :remote => true, data: {errors: :inline, success: admin_training_resource_path(@training_resource)} do |f| %>
 <%= f.select :status, UserTrainingResource.statuses.map {|k,v| [k.humanize, k]}%>
<%= f.submit 'Save', class: 'btn btn-primary'%>
<% end %>

Я знаю, что k тянет в текущем состоянии. Есть ли способ поставить условие для отображения другого значения?

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Я хотел бы создать метод класса, который дает мне правильные подсказки, и вызвать его в представлении.

class UserTrainingResourc < ApplicationRecord
  belongs_to :training_resource
  enum status: [:pending, :confirmed, :rejected, :removal]

  BACKEND_STATUS_PROMPTS{:removal => 'Request for removal'}

  def self.backend_status_options
    UserTrainingResource.statuses.map{|k, _v| [(BACKEND_STATUS_PROMPTS[k] || k.humanize), k]}
  end

  module SameScope
    HR = ['pending', 'confirmed', 'rejected', 'removal'].freeze
  end
end

Так что вы можете сделать

<%= f.select :status, UserTrainingResource.backend_status_options %>
0 голосов
/ 04 сентября 2018

Вы используете .humanize на клавишах, проверьте здесь доки, чтобы понять, что он делает https://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-humanize

Есть много вариантов сделать то, что вы хотите, я думаю, что лучшая практика - это использовать переводы.

форма (только что перенесла эту логику в помощник, чтобы она стала чище):

<%= select :status, user_training_resource_select_statuses %>

application_helper:

def user_training_resource_select_statuses
  UserTrainingResource.statuses.map{|k,v| [I18n.t(k), k]}
end

локаль / en.yml:

en:
  pending: Pending
  confirmed: Confirmed
  rejected: Rejected
  removal: Request to Removal

Теперь представление не обрабатывает логику (проще тестировать), это делает помощник. И модуль I18n обрабатывает имена.

Вы можете использовать разные помощники для внешнего и внутреннего интерфейса, один может использовать I18n, а другой - гуманизировать; или вы можете использовать I18n на обоих с одним и тем же помощником и использовать область видимости для обработки разных переводов

<%= select :status, user_training_resource_select_statuses(:frontend) %>

<%= select :status, user_training_resource_select_statuses(:backend) %>

def user_training_resource_select_statuses(scope)
  UserTrainingResource.statuses.map{|k,v| [I18n.t(k, scope: scope), k]}
end

en:
  frontend:
    pending: Pending
    confirmed: Confirmed
    rejected: Rejected
    removal: Removal
  backend:
    pending: Pending
    confirmed: Confirmed
    rejected: Rejected
    removal: Request to Removal
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...