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 %>

モデルで(これにはDBテーブルを使用したくありません):

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"] を直接出力します。つまり、文字列にリターンがあった場合のように、ケース コードに到達することはありません。 scan(..コード行。

レールがハッシュを返さないようにして、代わりにフラグを出力するにはどうすればよいですか?

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 に答える