1

以前の開発者が作成したコードのいくつかの修正を担当しました。彼はシリアル化されたチェックボックスの値をデータベースに保存しました。値は説明されているようにテーブルに保存されていることは間違いありませんが、フォームが表示されたときに、DBに保存された内容に従ってチェックボックスがオンになりません。フォームがどのチェックボックスをチェックする必要があるかを知る前に、そのデータのシリアル化を解除する必要があると想定しています。

次のコードがcheck_box_tagメソッドのchecked属性にtrueを割り当てることができるように、除外データを逆シリアル化する方法はありますか?

<p><label for="supplemental_material_type_exclusions">Exclusions</label><br/>
<%= ApplicantBudgetlevel.find(:all).collect { |p|
      if @supplemental_material_type.exclusions
        checked = @supplemental_material_type.exclusions.include?(p.level)
      else
        checked = false
      end
      "#{check_box_tag('supplemental_material_type[exclusions][]', p.level, checked)} #{p.level} - #{p.range}<br />\n"
    } %>
</p>
4

1 に答える 1

0

問題は範囲の問題だと思います; checked変数はのブランチの1つにのみ存在し、に達するとif存在しません。endこれを試して:

<p><label for="supplemental_material_type_exclusions">Exclusions</label><br/>
<%= ApplicantBudgetlevel.find(:all).collect { |p|
      checked = false
      if @supplemental_material_type.exclusions
        checked = @supplemental_material_type.exclusions.include?(p.level)
      end
      "#{check_box_tag('supplemental_material_type[exclusions][]', p.level, checked)} #{p.level} - #{p.range}<br />\n"
    } %>
</p>

elseブランチを削除して、値をfalseデフォルトに設定しただけです。

ifブランチがtrueの場合にのみチェックボックスを表示する必要がある場合、これによりさらにエラーが発生する可能性があります。その場合は、次のことを試してください。

<p><label for="supplemental_material_type_exclusions">Exclusions</label><br/>
<%= ApplicantBudgetlevel.find(:all).collect { |p|
      if @supplemental_material_type.exclusions
        checked = @supplemental_material_type.exclusions.include?(p.level)
        "#{check_box_tag('supplemental_material_type[exclusions][]', p.level, checked)} #{p.level} - #{p.range}<br />\n"
      end
    } %>
</p>

2つのアプローチのどちらが正しいかは、ここから判断できる範囲を超えていますが、最初に最初のアプローチを試し、ログを調べて、新しいエラーや別のエラーや警告がないかどうかを確認します。

于 2012-04-19T00:18:42.047 に答える