Как использовать константы Ruby в представлениях Rails? - PullRequest
1 голос
/ 03 мая 2011

В моем файле user.rb есть следующая константа, которая используется для раскрывающегося меню выбора в одной из моих форм. Это сохраняет числовое значение.

По моему мнению, когда я получу это сохраненное числовое значение, могу ли я использовать эту константу, чтобы получить имя, которое соответствует ей, и отобразить его? Или я должен сделать отдельный массив, который занимается этим?

LANGPROFICIENCY = [
  ["Elementary proficiency",           1],
  ["Limited working proficiency",      2],
  ["Professional working proficiency", 3],
  ["Full professional proficiency",    4],
  ["Native or bilingual proficiency",  5]
]

Ответы [ 4 ]

3 голосов
/ 03 мая 2011

Во-первых, хеш является отличной отправной точкой для такого рода данных.Вместо:

LANGPROFICIENCY = [
  ["Elementary proficiency",           1],
  ["Limited working proficiency",      2],
  ["Professional working proficiency", 3],
  ["Full professional proficiency",    4],
  ["Native or bilingual proficiency",  5]
]

используйте:

LANGPROFICIENCY = {
  "Elementary proficiency"           => 1,
  "Limited working proficiency"      => 2,
  "Professional working proficiency" => 3,
  "Full professional proficiency"    => 4,
  "Native or bilingual proficiency"  => 5
}

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

Оттуда вы можете изменить хеш:

Hash[*LANGPROFICIENCY.to_a.map{ |a| a.reverse }.flatten]

, который вернет:

{
  1 => "Elementary proficiency",
  2 => "Limited working proficiency",
  3 => "Professional working proficiency",
  4 => "Full professional proficiency",
  5 => "Native or bilingual proficiency"
}

упрощая поиск в обратном порядке.

Делая все это на один шаг дальше, если вы знаете, что столкновений не будет, чего быть не должно:

LANGPROFICIENCY = LANGPROFICIENCY.merge( Hash[ *LANGPROFICIENCY.to_a.map{ |a| a.reverse }.flatten ] )

, что приводит к:

{
  "Elementary proficiency"           => 1,
  "Limited working proficiency"      => 2,
  "Professional working proficiency" => 3,
  "Full professional proficiency"    => 4,
  "Native or bilingual proficiency"  => 5,
  1 => "Elementary proficiency",
  2 => "Limited working proficiency",
  3 => "Professional working proficiency",
  4 => "Full professional proficiency",
  5 => "Native or bilingual proficiency"
}

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

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

Теперь, если вы пробовали каждый шаг в IRB или в Ruby, вы получите несколько предупреждений о «warning: already initialized constant LANGPROFICIENCY».Ответ заключается в том, чтобы использовать переменную вместо константы.Кроме того, LANGPROFICIENCY вряд ли является читаемым именем переменной.Я бы порекомендовал использовать lang_proficiency или что-то подобное.

1 голос
/ 03 мая 2011

Если вы хотите получить имя,

LANGPROFICIENCY.rassoc(2)[0] #=> "Limited working proficiency"

Но если ваш массив должен иметь числовое значение в порядке возрастания, у вас есть большая избыточность здесь. Вместо того, что у вас есть, вы можете упростить это до:

LANGPROFICIENCY = [
  "Elementary proficiency",
  "Limited working proficiency",
  "Professional working proficiency",
  "Full professional proficiency",
  "Native or bilingual proficiency"
]

и сделать

LANGPROFICIENCY[2-1] #=> "Limited working proficiency"
1 голос
/ 03 мая 2011

LANGPROFICIENCY - это массив массивов.Не обращайте внимания на то, что это константа, это просто означает, что вы не можете это изменить.

selected_entry = LANGPROFICIENCY.select {|entry| entry[1] == selected_id }

>> LANGPROFICIENCY = [["Elementary proficiency",1], ["Limited working proficiency",2], ["Professional working proficiency",3], ["Full professional proficiency",4], ["Native or bilingual proficiency",5]]
=> [["Elementary proficiency", 1], ["Limited working proficiency", 2], ["Professional working proficiency", 3], ["Full professional proficiency", 4], ["Native or bilingual proficiency", 5]]

>> selected_id = 3
=> 3

>> selected_entry = LANGPROFICIENCY.select {|entry| entry[1] == selected_id }                                                     
=> [["Professional working proficiency", 3]]

>> selected_entry.flatten
=> ["Professional working proficiency", 3]

Предположим, что выбранный вами индекс находится в selected_id и имеет значение 3: Теперь у вас есть массив, который соответствует записи в LANGPROFICIENCY.

0 голосов
/ 03 мая 2011

Вы можете создать вспомогательный метод для вашего представления, который использует эту константу для извлечения навыка из целого числа.

Ваш помощник может выглядеть так:

def proficiency_from_value value
  return LANGPROFICIENCY.flatten[2 * (value - 1)]
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...