rbc-incubatorの皆様、はじめまして。
技術者同士の相談の場を設けていただき
しかも、招待までしていただき
とてもうれしく思います。
せっかくなので一番乗りを目指してみました。
ご相談内容・・・というか「みなさんどうしてる?」
というのを伺いたいのですが、標記の通り、
以下のようにひとつのフォームに複数のsubmitボタンを設けておき
押したボタンによりcontrollerでのメソッドを変えたいなあ、と
思っています。
[view]
<%form_for :hoge, @model, :url=>{:action=>'update', :id=>@model} do |f| %>
<% = f.text_field, :hoge_name %>
<% = f.submit :name=>'update' %>
<% = f.submit :name=>'delete' %>
<% end %>
上の例だと必ずコントローラのupdateメソッドへいくので
[controller]
def update
# 更新
unless params[:update].nil?
(更新処理)
return
end
# 削除
unless params[:destroy].nil?
self.destroy
return
end
end
def destroy
(削除処理)
end
なんてやってますが、個人的になんかイケてないなあと感じています。
(おそらくASP.NETなどの完全なイベントドリブンが頭の中にあるからでしょう)。
他に手順はないか私なりに調べたり考えたりしてみましたが、
1.以下を参考にroutes.rbの設定とmetodの書き換え
http://d.hatena.ne.jp/zariganitosh/20080205/1202200505
2.JavaScriptでsubmit先を変えるようなプラグイン
3.全部submit_to_remoteにしてしまう。
1.は一般的な方法なのかがよくわかりません。
2.は世にあるのか?もしなかったら自分で作ろうかとも考えています。
3.はさすがにあんまりですね・・・。
みなさんどうやってらっしゃいますか?
よろしければ教えてください。
早速のご返答ありがとうございます。
おっしゃる通り、もしかしたら最初の例ではdeleteの場合、
入力データの送信は必要なく、button_toでいかもしれません。
ただ、どちらもフォーム内のデータを送信する必要があるケースが
あります。例えばこんな感じです。
---[Viewここから]----
<% form_for :SelectCar do |f|%>
<TABLE style="width:100%">
<TR>
<TD align=right style="width:60%">
<%= f.select :SelCar, @CarList,{}, :size=>20 %>
</TD>
<TD align=left>
移動
<BR>
<%= f.submit '上', :name=>'carup' %>
<BR>
<%= f.submit '下', :name=>'cardown'%>
</TD>
</TR>
</TABLE>
<% end %>
---[Viewここまで]----
これは、:SelCarコンボボックスに表示されている車輌マスタ一覧の
表示順を並べ替える処理で、:SelCarコンボボックスを選択し、
carupボタンを押すと選択した値の表示順がひとつ繰り上がり
cardownボタンを押すと選択した値の表示順がひとつ繰り下がります。
どちらもSelcarコンボボックス値を送信する必要があります。
これも現在、以下のようにしてます。
---[Controllerここまで]----
def index
unless params[:SelectCar].nil? || params[:SelectCar][:SelCar].nil?
# 車輌表示順上昇処理
unless params[:carup].nil?
self.carup
end
#所属表示順下降処理
unless params[:cardown].nil?
self.cardown
end
end
@CarList = Car.find(:all, :order=>'disp_seq')
def carup
(表示順上昇)
end
def cardown
(表示順下降)
end
---[Controllerここまで]----
もう一点、最初の例で削除もいったんbutton_toにしてみたのですが、
ボタンをフォームの外に書かなければいけなくなり
見栄えがよくなく(updateとdeleteボタンが横に並ばない!)
断念した経緯があります。
本当はRailsでは1フォーム1submitが理想なんでしょうね・・・
村山さん、見ず知らずの人間に
ご丁寧に返答いただき、ありがとうございます。
>この場合は、AJAXを使った方がいいかもですね。
>
> 試してないので本当に書けるか分かりませんが、subimt_to_remoteで
>書けば良いような気もします。
>
> あとは、Javascriptのプラグインですか。
やっぱり考えられる方法はこの2つですかね。
急ぎではないので、
とりあえず、現在のソースはそのままにしておいて
先々必要にかられた時はプラグイン化を検討
したいと思います。
秋間さん、いつも遅くまでお仕事ご苦労様です。
>田代さんのお話の機能は実際仕事で作りました。
>javascriptでformのmethodやactionを変更させてます。
なるほど、やっぱりそうですか。
>ただし、こういう場合の選択は一概にどれと言えないと
>思います。たとえばURLと画面遷移についてお客様から
>細かく要求されている場合、おそらくAjaxを使うのは
>NGになることが多いでしょう。
>
>逆にお客様があまりURLとかを気にせずに、画面遷移は
>ブラウザに表示されているURLと関係なくてもOKという
>場合は、Ajaxの方が作りやすいかも知れません。
全くおっしゃる通りだと思います。
プロジェクト体験者の言葉の重みを感じます
(いや、具体的にどこがと言われると返答に困るのですが(^^ゞ)。
プロジェクトによって方向性は違うから、プログラマは
どっちでもできるように腕を磨いておくべきかと。
>RESTfulなURL設計は、GET/POST/PUT/DELETEという
>意味をほとんど失ってしまったHTTPのメソッドに
>ちゃんと意味を持たせ直そうということなので、それら
>だけじゃ足らないときには、別の方法を考えなければ
>なりません。
たぶん私はroute.rbの機能(というより「RESTfulとは?」)を
かなり誤解している部分があると思います。
これまで私はroute.rbはイベントドリブンを実現
するための機能だとばかり思っていました。
今一度勉強しなおしたいと思います。
あ、RESTとは?について勉強会の一セッションとして
改めてみんなで復習しなおしてみても面白いかもしれませんね。
まだ修行中の身ですが、これからも
よろしくお願いします。