dポイントプレゼントキャンペーン実施中!

現在Rails3でWEBアプリの開発をしているのですが
実現方法が不明な事が有るので質問させて頂きました。

実行環境は

  OS:Windows7
  Railsバージョン:3.0.9
  APサーバー:WEBrick

です。

実現方法が不明なのは、一つのフォームに複数のサブミットボタンを配置し
コントローラーでどのボタンが押されたのか判定する方法です。

ビューにおいてフォーム内に

 <%= submit_tag 'OK', {:disable_with => "Sending…"} %>
 <%= submit_tag 'CANCEL', {:disable_with => "Sending…"} %>

と言う様にサブミットボタンを配置し
コントローラーでどちらのボタンが押されたのかを判定する方法なのですが
検索して調べてみると

 if 'OK' == params[:commit] then
  OKボタンが押された際の処理
 else
  CANCELボタンが押された際の処理
 end

と言う風に出来ると言う情報を見つけたのですが、実際にやってみると
上記の様な値はparamsから取得出来ないので、正しく動作しません。

paramsで取得した値の中身を見ても、それらしい値も無く
何を判断すればどのボタンが押されたのかを判断出来るのかが判らず
非常に困っております。

サブミットボタンにjavascriptのコードを埋め込み
送信前にHIDDEN項目にクリックされたボタンを表す値を埋め込むと言った方法で
回避する事も可能かとは思いますが、標準的なやり方とも思えず

また、良く行われる処理だと思いますので、他に方法が有る様に思えます。

どなたかご存知の方が居れば御回答お願いします。

A 回答 (2件)

どうやら、このバージョンのrails.jsのバグのようです。


{:disable_with => "Sending…"} のオプションをとれば、
if 'OK' == params[:commit] then
  OKボタンが押された際の処理
 else
  CANCELボタンが押された際の処理
 end
は有効になります。(params[:commit]に正しい値が設定されるようになります)

従って、このままの状態では、対策としては、 {:disable_with => "Sending…"}をとるか、
質問者さんが、書かれた方法になります。

どうしても、{:disable_with => "Sending…"}をとりたくなく、
rails.jsをjquery用のものに変えてよいなら、荒療治になりますが、以下の方法があります。
ファイルを書き換えるので、必ずバックアップを取って行なってください。
1.jqueryをダウンロード
http://docs.jquery.com/Downloading_jQuery
jQuery CDN
jquery-1.6.4.min.js をダウンロードし、 jquery.jsにリネームする。
2.jquery用のrails.jsを使う。
https://github.com/rails/jquery-ujs/tree/master/ …
からダウンロードする。
3.publicのjavascripts下に以下のファイルがあるので削除する。
prototype.js controls.js effcts.js dragdrop.js
4.ダウンロードした
jquery.js と rails.js をpublicのjavascripts下に配置する。
(rails.jsは上書きする)
5.アプリケーション設定ファイルを変更する。
通常、app\vies\layoutsのapplication.html.erbの内容は
java_script_include_tag:defaults
になっています。この場合、上記で削除したファイルをこのままではincludeしてしまう為、
デフォルトのicludeを rails.js jquery.js application.jsにするために
以下の行を
configの下のapplication.rbに追加します。
config.action_view.javascript_expansions[:defaults] = %w(jquery rails)

追加したファイルは、以下のようになります。
module Apart
class Application < Rails::Application
  途中省略
config.action_view.javascript_expansions[:defaults] = %w(jquery rails)
end
end
これで、デフォルトの状態で、 rails.js jquery.js application.js
が読み込まれるようになります。
そして、params[:commit]が参照可能になります。
当方、以下の環境で確認済みです。
rails 3.0.7
ruby 1.9.2p180 (2011-02-18) [i386-mingw32]
windows-7 64Bit
以上。
    • good
    • 0
この回答へのお礼

御回答ありがとうございます。

原因が判らなかったのでサーバーサイドを調べていたのですが
テキストフィールド等の値は送信されて来ていましたので
いずれにしろフレームワークの問題だろうとは思っていたのですが
JavaScriptの問題だったのですね

回答者さんに提案して頂いたjqueryへの乗り換えか
rails.jsの改善かを検討したいと思います。


丁寧な御回答ありがとうございました。

お礼日時:2011/11/15 16:38

この回答への補足

回答ありがとうございます。

検索して頂いたボタンに名前を付けると言う方法ですが
実はこれも試しました。

name属性を付けても、paramsにその名前の値が入っていないので
判定が出来ませんでした。

色々と検索したり試したりはしたのですが、ボタンの情報はparamsに
代入されない様です。

その様な情報がインターネット上に有ると言う事は
以前のバージョンでは出来たのだと思いますが
Rails3では出来なくなっている様です。

補足日時:2011/11/15 05:32
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!