IT Office Nishimiyahara

個人用スマホから商用プログラミングまでなんでもお任せ下さい

HTML::AutoFormのchecked問題が解決できた

      2014/05/14

未だにNanoAを触っているわけですが、ずっと悩んでいたchecked問題を、解決させることが出来ました。

checked=>1にしても、チェックが入っていない状態になる。 HTML::AutoFormのtディレクトリにあるコードと同じように書いているのだけど。 何故だ…。

[NanoAでデータベースを使ってみる - 日曜プログラマのそゞろ事]

リファレンスの真偽判定の仕方がまずかったようです。


HTML::AutoFormのtディレクトリにあるテストコードを単純にCGIに置き換えてレンダリングしたところ、checkedの設定が生きませんでした。
テストコードを見てみると、formのrenderではなく、fieldのrenderでテストをしていました。
ということは、formのrenderに問題がある、という事になります。
しかし、追いかけていったところ、結果的にはHTML/AutoForm/Field/InputCheckable.pmに問題がありました。
formのrenderは、ポストしているデータがあれば、そのデータを配列のリファレンスで渡すことにしています。
こうすることで、初期値(プログラムに書いている値)ではなく、ポストされた値でレンダリングされるようになります。
InputCheckable.pmのrenderをよく見ると、リファレンスを受けている変数を真偽判定して、真ならば配列のリファレンスとみなして処理しています。
しかし、ここに問題がありました。
初期値のcheckedが生きないのは、ここが必ず真で判定される(リファレンスは真です)からです。
初期値の(formのrenderで空の配列のリファレンスが渡された)場合は、偽で判定して欲しいので、一度配列に入れてから、その配列を真偽判定(配列が空ならば偽になります)してやれば問題ないと思います。
これで、初期値の場合も、ポストした場合も、問題なさそうでした。
元々のテストも問題なく通っています。

respo

respo link

ZenBackWidget

 - 情報技術について