2012-04-18 8 views
1

以前の開発者が作成したコードでいくつか修正するように割り当てられました。彼はデータベースにシリアライズされたチェックボックスの値を保存しました。値が説明されているようにテーブルに格納されているのは確かですが、フォームが表示されたときにチェックボックスはDBに格納された内容に従ってチェックされません。どのチェックボックスをチェックすべきかをフォームが知る前に、そのデータをシリアル化しておく必要があると仮定しています。Rails 1.2.3データのシリアル化解除

除外データのシリアル化を解除して、次のコードで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> 
+0

彼が使用したシリアライゼーションは、モデルの指示として実行されました。だから私はそれが自家製のシリアル化だとは思わない。 – Skittles

+0

あなたは今どのような出力を得ていますか? – sarnold

+0

さて、すべてのチェックボックスは、尊敬のラベルと同じように表示されます。唯一間違っているのは、最初にチェックされたシリアル化された値が上記のポストされたコードを使用してチェックされていないことです。値がシリアル化され、シリアル化されていない状態でシリアル化されている必要があるため、条件によって何がチェックされ、何をすべきではないかを判断できるようになります。 – Skittles

答えて

0

私はこの問題はスコープの問題だと思います。 checked変数はifのブランチの1つにのみ存在し、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の場合に表示する必要があるかどうか

これはさらに、障害を引き起こす可能性があります - その場合には、以下試してください:2つのアプローチの正しい

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

は、より依存します私はここから測ることができます - しかし、私は最初のものを試して、新しいか違うエラーや警告のログを調べます。

+0

こんにちはsarnold。素晴らしい提案をありがとう。最初の例は、チェックボックスが常に表示される必要があるため機能します。私は今、根本的な原因を見ていると思います。シリアライズされたデータは問題の半分です。残りの半分は、モデルのserialize呼び出しが、データベースの "Level 1"のチェックボックス値を "Level%25201"に転置していることです。私は、二重空間が一つの空間と決して一致しないので、if条件は決して真実ではないと確信しています。これは何とか上記の表示ロジックのためにエンコードされていないのですか? – Skittles

+0

_model_でシリアライゼーション/デシリアライゼーションを正しく行い、ビューコードをこのままで残しておかなければならないと感じています。モデル内のシリアライゼーションコードをより簡単に元に戻すことができるようにする必要がある場合は、その価値があると思います。 – sarnold

+0

ありがとう、sarnold。私はそれが当時の魔法の問題だと思います。私はRailsにはあまりよくないので、この最新の提案のための私の選択肢が何であるかは完全にはわかりません。仰るとおりです。シリアライズはActiveRecordメソッドだと思われますが、ドキュメントではシリアライゼーションの仕方を操作する方法が示されていないため、わかりやすいデシリアライゼーション方法もありません。そこに何か提案はありますか? – Skittles

関連する問題