学習RoR(11) radio_button_tag
リストページで並べ順を切り替えられるようにしてみた。はじめは単純にテキストリンクでやってみたが、ラジオボタンにしてみるのもよいかなと変えてみる(こういう効果があったのかもしれない)。
list.rhtml(部分だけどほぼこんな感じ)
<div>
<%= start_form_tag :action => 'list' %>
<%= radio_button_tag :sort, "code", "checked" %><%=h _('Code') %>
<%= radio_button_tag :sort, "name" %><%=h _('Name') %>
<%= submit_tag _('Sort') %>
<%= end_form_tag %>
</div>
<div class="booklist">
<table>
<%= render :partial => 'listitem', :collection => @items %>
</table>
</div>
でもってコントローラで、
def list
case params[:sort]
when 'name'
@page, @items = paginate :items, :order => 'name_read ASC', :per_page => 10
else
@page, @items = paginate :items, :order => 'code ASC', :per_page => 10
end
end
こんな感じにしたらとりあえず切り替えはできるのだけれど、list.rhtml 全体を書き換えてしまうのでラジオボタンのチェックが残らない。つねにデフォルト状態。これをなんとか残せるようにしたいのだけれど、どうもうまい手が見えない。
observe_field とかで render すればいいのか? とも思ったのだけれどどうもうまくいかない。
テキストリンクだってリンクなしにするわけではないので同じなので、デフォルトチェックをなくしておくというのでよいのだけれど。なんかうまい方法がないものだろうか。と悩む日々。
追記:12/28
arton さんのコメントでさっそく修正。DRY な方向での検討はするとしてひとまずはこれで。ただ、これだけだと始めにページにアクセスしたときにチェックされないままなので、コントローラのアクションのデフォルト処理部分( else 以降)に
params[:sort] = "code"
を追加してみた。
【 Rails のお薦め本 】
| 固定リンク
コメント
<%= radio_button_tag :sort, "code", "checked" %><%=h _('Code') %>
とすると常にcodeにチェックが入ります(第3パラメータが真なので)。
これを受け取った値との比較にすれば良いではないでしょうか。
<%= radio_button_tag :sort, "code",
params[:sort] == "code" %>
<%= radio_button_tag :sort, "code",
params[:sort] == "name" %>
をもっとDRY(第2パラメータが第3パラメータにも出てくるのがちょっといやですね)に書くような方向で。
投稿: arton | 2006.12.27 02:00
書きなおしです。
<%= radio_button_tag :sort, "code", "checked" %>
とすると常にcodeにチェックが入ります(第3パラメータが真なので)。
これを受け取った値との比較にすれば良いではないでしょうか。
<%= radio_button_tag :sort, "code", params[:sort] == "code" %>
<%= radio_button_tag :sort, "code", params[:sort] == "name" %>
をもっとDRY(第2パラメータが第3パラメータにも出てくるのがちょっといやですね)に書くような方向で。
投稿: arton | 2006.12.27 02:03
ありがとうございます。確かにこれで期待に近くなりました。 DRY な方向を模索してみます。
#先のコメントは見えなくなっていたのですね。通知メールでは見えていたので?になっていました。
#しかし一体いつ眠られているのですか?(笑)。
投稿: ムムリク | 2006.12.27 11:43