Почему метод сканирования для строк распечатывает непосредственно в рельсах и игнорирует остальной код

У меня есть поле (строка) в БД, в котором хранится список значений, полученных из флажка, если они отмечены:

Пример:

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"] напрямую, он никогда не достигает кода case, как если бы в строке был возврат. сканировать (.. строку кода.

Как я могу запретить рельсам возвращать хэш и вместо этого печатать флаг?


person juliangonzalez    schedule 06.10.2012    source источник


Ответы (2)


Попробуйте изменить свой метод на следующий:

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 неявно возвращает последнее значение из функции. По поводу вашего метода хранения - предлагаю вам пересмотреть свой способ хранения. Например, в mongoid можно использовать массивы. Для активной записи что-то вроде , которое может решить вашу проблему.

person Vadim Chumel    schedule 06.10.2012
comment
Вадим, это вроде как сработало, но теперь он печатает html-код в представлении (а не интерпретирует его). Большое спасибо, это много, если я попрошу вас немного помочь мне с этим и заставить его интерпретировать html вместо того, чтобы показывать код в представлении? - person juliangonzalez; 06.10.2012
comment
Чувак! Это сделано. Я добавил html_safe к переменной результата в конце, и это сработало. Большое спасибо. - person juliangonzalez; 06.10.2012
comment
@JGonzalezD да, совсем забыл про html_safe. Рад, что смог помочь, чувак :) - person Vadim Chumel; 06.10.2012

Итератор each не возвращает более одного значения. Если возврат не объявлен явно, он вернет последний объект, к которому был осуществлен доступ в методе, которым в данном случае является string.scan(/\d/). Вы можете изменить .each на .map, который вернет массив content_tags, который будет повторяться в представлении:

<% insert_languages(@so_profile.languages).each do |lang| %>
    <%= lang %>
<% end %>
person Zach Kemp    schedule 06.10.2012