1フォームに複数のsubmitボタンを設け、それぞれターゲットメソッドを変える方法

3,347 views
Skip to first unread message

田代 和記

unread,
Mar 20, 2008, 8:29:53 PM3/20/08
to rbc-in...@googlegroups.com
オフィスメーション@長崎の
田代です。

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.はさすがにあんまりですね・・・。

みなさんどうやってらっしゃいますか?
よろしければ教えてください。


jun...@gmail.com

unread,
Mar 20, 2008, 9:41:05 PM3/20/08
to rbc-incubator
村山です。

 submitの使い方がおかしいような気がします。

 私の勘違いでなければ、submitは入力フォームのデータを送信する為の
ものだったと思います。

 入力フォームのデータを送信する必要がないならbotun_toを使った方が
良くないですか?

 私の勘違いなら申し訳ありません。
> 1.以下を参考にroutes.rbの設定とmetodの書き換えhttp://d.hatena.ne.jp/zariganitosh/20080205/1202200505

田代 和記

unread,
Mar 20, 2008, 10:10:21 PM3/20/08
to rbc-in...@googlegroups.com
村山様
オフィスメーションの
田代です。

早速のご返答ありがとうございます。
おっしゃる通り、もしかしたら最初の例では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が理想なんでしょうね・・・

jun...@gmail.com

unread,
Mar 20, 2008, 11:07:10 PM3/20/08
to rbc-incubator
村山です。

 なるほどね。

 この場合は、AJAXを使った方がいいかもですね。

 試してないので本当に書けるか分かりませんが、subimt_to_remoteで
書けば良いような気もします。

 例)あくまで例なので。 ^^;
<div id="update_form">
 <% form_tag ・・・ do %>
<TABLE style="width:100%">
<TR>
<TD align=right style="width:60%">
<%= f.select :SelCar, @CarList,{}, :size=>20 %>
</TD>
<TD align=left>
移動
<BR>
<%= submit_to_remote '上', "send", :url => {:action =>
'carup'}, :update => 'update_form' %>
<BR>
<%= submit_to_remote '上', "send", :url => {:action =>
'cardown'}, :update => 'update_form' %>
</TD>
</TR>
</TABLE>
<% end %>
</div>

 あとは、Javascriptのプラグインですか。

akm2000

unread,
Mar 21, 2008, 2:02:05 PM3/21/08
to rbc-incubator
秋間です。

田代さんのお話の機能は実際仕事で作りました。
javascriptでformのmethodやactionを変更させてます。

ただし、こういう場合の選択は一概にどれと言えないと
思います。たとえばURLと画面遷移についてお客様から
細かく要求されている場合、おそらくAjaxを使うのは
NGになることが多いでしょう。

逆にお客様があまりURLとかを気にせずに、画面遷移は
ブラウザに表示されているURLと関係なくてもOKという
場合は、Ajaxの方が作りやすいかも知れません。

ちなみにザリガニさんのところの例はRESTfulなリクエスト
をどう処理するの?という話なので、一つのフォームのデータ
を複数アクションで使いたいって場合とは、似ているようで
結構違います。

RESTfulなURL設計は、GET/POST/PUT/DELETEという
意味をほとんど失ってしまったHTTPのメソッドに
ちゃんと意味を持たせ直そうということなので、それら
だけじゃ足らないときには、別の方法を考えなければ
なりません。

URL設計に関しては、プロジェクトでどういう方針を
採用するのかで、結構違ってきます。
・PRG(Post Redirect Get)パターンを採用?
・携帯からのアクセスある?
・Webサービスやる?
・データの持ち回りはセッション?hidden?

その他いろいろ絡むものが多いので、あー最初に
きっちり試して決めておけばよかったなーと
いますごく実感してます。

田代 和記

unread,
Mar 21, 2008, 9:52:39 PM3/21/08
to RBC-incubator
オフィスメーションの
田代です。

村山さん、見ず知らずの人間に
ご丁寧に返答いただき、ありがとうございます。

>この場合は、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とは?について勉強会の一セッションとして
改めてみんなで復習しなおしてみても面白いかもしれませんね。

まだ修行中の身ですが、これからも
よろしくお願いします。


Reply all
Reply to author
Forward
0 new messages