0

我在 DB 中有一个字段(字符串),如果选中,则存储从复选框获取的值列表:

例子:

checkbox1 [X] //Value 1
checkbox2 [ ] //Value 2
checkbox3 [X] //Value 3
checkbox4 [X] //Value 4
checkbox5 [ ] //Value 5

它在数据库中存储字符串“--- -'1' -'3' -'4'”(不带双引号)我不知道为什么,因为在我的表单中我有:

<%  SoProfile::LANGUAGES.each do |key, value| %>
  <div class="fluid">
    <%= f.label :languages,class: "checkbox" do %>
      <%= key %> <%= f.check_box :languages, {:multiple => true}, value, nil %>
    <% end %>
  </div>
<% end %>

在模型中(我不想为此使用数据库表):

LANGUAGES = { Espanol: 1, Ingles: 2, Portugues: 3, Italiano: 4, Mandarin: 5 }

无论如何,对于上面的示例,它存储该字符串“--- -'1' -'3' -'4'”,我想根据语言显示国家标志,而不是放置语言名称。

我为此创建了一个辅助方法:

def insert_languages(string)
  string.scan(/\d/).each do |i|
    case i
      when i == "1"
        content_tag(:div,"",class: 'flag flag-co')
      end
  end
end

在我看来,这就是所谓的:

<tr>
  <td>Idiomas <br /> 
    <%= insert_languages(@so_profile.languages) %>                                                                                   
  </td>
</tr>

但是辅助方法不会从 .scan 传递,而是直接打印出哈希 ["1" "3" "4"],它永远不会到达案例代码,就像字符串中有返回一样。扫描(.. 代码行。

如何防止 rails 返回哈希值并打印标志?

4

2 回答 2

0

尝试将您的方法更改为以下内容:

def insert_languages(string)
  result = ""
  string.scan(/\d/).each do |i|
    case i
      when "1"
        result += content_tag(:div,"",class: 'flag flag-co')
      end
  end
  result
end

由于 ruby​​ 从 .each 块返回值,因此您得到了哈希值。Ruby 隐式返回函数的最后一个值。关于您的存储方法 - 我建议您重新考虑您的存储方法。例如,在 mongoid 中,您可以使用数组。对于主动记录,类似的东西可以解决您的问题。

于 2012-10-06T17:52:22.773 回答
0

each迭代器不会返回一个以上的值。如果没有明确声明 return,它将返回方法中访问的最后一个对象,在这种情况下是string.scan(/\d/). 您可以更改.each.map,这将返回一个 content_tags 数组,它将在视图中迭代:

<% insert_languages(@so_profile.languages).each do |lang| %>
    <%= lang %>
<% end %>
于 2012-10-06T17:56:59.300 回答