如何在Rails视图中使用Ruby常量?

时间:2011-05-02 21:31:48

标签: ruby-on-rails ruby

我的user.rb文件中有以下常量,用于我的某个表单中的选择下拉菜单。它保存了一个数值。

在我看来,当我获得保存的数值时,我可以使用此常量来检索与其对应的名称并显示它吗?或者我是否必须制作一个处理此问题的单独数组?

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

4 个答案:

答案 0 :(得分:3)

首先,哈希是这类数据的一个很好的起点。而不是:

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
}

如果需要,您可以单独抓取keysvalues,在您需要时单独抓取,或者您可以查找密钥以查找值,就像一直一样。

从那里你可以反转哈希:

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 :(得分:1)

如果你想得到这个名字,

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"

答案 2 :(得分:1)

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中的条目匹配的数组。

答案 3 :(得分:0)

您可以为视图创建一个帮助方法,它使用此常量从整数中检索熟练度。

你的助手看起来像这样:

def proficiency_from_value value
  return LANGPROFICIENCY.flatten[2 * (value - 1)]
end