Правильный способ обработки предопределенного набора приветствий в рельсах - PullRequest
1 голос
/ 06 февраля 2012

Я только что начал с моего первого реального приложения rails.

У меня есть предопределенный набор приветствий ("Herr", "Frau," Herr und Frau ") для моей модели клиента.иметь дело с экспортом в CSV-файл, где "Herr" должен быть целым числом 1, "Frau" 2 и "Herr und Frau" = 3.

Поэтому я подумал, что было бы разумно сохранить это приветствиекак целое число и просто добавьте метод salutation_readable в мою модель клиента, например:

def salutation_readable
    case salutation
    when 1
      "Herr"
    when 2
      "Frau"
    when 3
      "Herr und Frau"
    end
end

, чтобы отобразить приветствие в моих представлениях.

В частичной форме клиента я добавил:

<%= f.select(:salutation, options_for_select([['Herr', 1], ['Frau', 2], ['Herr und Frau', 3]])) %>

Все работает, как и ожидалось, кроме пользовательского представления редактирования, где предварительно выбранное значение всегда является первой записью, а не моей сохраненной.

Ответы [ 2 ]

0 голосов
/ 31 октября 2012

Конечно, проблема с этим подходом состоит в том, что вы определяете связь между приветствием и id в двух местах.То есть, если вы решите добавить «Доктор» позднее, вы можете сделать это следующим образом:

def salutation_readable
  case salutation
  when 1
    "Herr"
  when 2
    "Frau"
  when 3
    "Doktor"
  when 4
    "Herr und Frau"
  end
end

Но не обновлять выбор или обновлять выбор так:

<%= f.select(:salutation, options_for_select([['Herr', 1], ['Frau', 2], ['Herr und Frau', 3], ['Doktor', 4], @customer.salutation_readable)) %>

В любом случае вы получите несоответствие между выбором формы и salutation_readable.

Лично у меня будет соблазн сохранить приветствие в виде строки.

Если вы должны сохранить его с помощью идентификатора, я бы определил связь между идентификатором и приветствием в модели, а затем использовал бы это определение везде.

class User

  def self.salutations = {
    1 => 'Herr',
    2 => 'Frau',
    3 => 'Herr und Frau',
    4 => 'Doktor'
  }

  def salutation_readable
    self.class.salutations[salutation.to_i]
  end

end

Тогда, по вашему мнению, вы могли бысделайте это:

<%= f.select(:salutation, User.salutations.to_a.collect(&:reverse))

Затем его также будет легче расширять, так что User.salutations вызывает отдельный объект Salutation или файл перевода, например.

0 голосов
/ 06 февраля 2012

options_for_select принимает второй параметр в качестве выбранной по умолчанию опции.

<%= f.select(:salutation, options_for_select([['Herr', 1], ['Frau', 2], 
['Herr und Frau', 3]], @customer.salutation_readable)) %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...