Rails3でのクリックされたボタンの判定について

このQ&Aのポイント
  • Rails3でのクリックされたボタンの判定方法が不明です。一つのフォームに複数のサブミットボタンを配置し、コントローラーでどのボタンが押されたのか判定したいですが、正しい方法がわかりません。
  • 試した方法ではparamsから値を取得できず、どのボタンが押されたかを判断することができません。javascriptを使用してボタンが押されたことを判定する方法も考えられますが、もっと標準的な方法があるか知りたいです。
  • この問題は一般的な処理であるため、他に方法があると思います。Rails3でのクリックされたボタンの判定について詳しい方の回答をお待ちしています。
回答を見る
  • ベストアンサー

Rails3でのクリックされたボタンの判定について

現在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項目にクリックされたボタンを表す値を埋め込むと言った方法で 回避する事も可能かとは思いますが、標準的なやり方とも思えず また、良く行われる処理だと思いますので、他に方法が有る様に思えます。 どなたかご存知の方が居れば御回答お願いします。

  • Ruby
  • 回答数2
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.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/src からダウンロードする。 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 以上。

in_no_delusion
質問者

お礼

御回答ありがとうございます。 原因が判らなかったのでサーバーサイドを調べていたのですが テキストフィールド等の値は送信されて来ていましたので いずれにしろフレームワークの問題だろうとは思っていたのですが JavaScriptの問題だったのですね 回答者さんに提案して頂いたjqueryへの乗り換えか rails.jsの改善かを検討したいと思います。 丁寧な御回答ありがとうございました。

その他の回答 (1)

  • koko_u_u
  • ベストアンサー率18% (216/1139)
回答No.1
in_no_delusion
質問者

補足

回答ありがとうございます。 検索して頂いたボタンに名前を付けると言う方法ですが 実はこれも試しました。 name属性を付けても、paramsにその名前の値が入っていないので 判定が出来ませんでした。 色々と検索したり試したりはしたのですが、ボタンの情報はparamsに 代入されない様です。 その様な情報がインターネット上に有ると言う事は 以前のバージョンでは出来たのだと思いますが Rails3では出来なくなっている様です。

関連するQ&A

  • rails3初心者 年齢を表示する

    rails3を勉強中です。 お詳しい方、ご教授いただけたら嬉しいです。 実装したい内容 プルボンタンで年齢「20」が選ばれた場合、 その結果を出力する(非モデル) ==================== views:presons/index.html ==================== <%= form_tag :action => :age do %> <%= select("form","age", (1..100))%> <%= submit_tag "表示する"%> <% end %> ==================== presons_controller.rb ==================== def index @preson = Preson.new end def age @preson = params[:form][:age] redirect_to :action => 'index' end ==================== views:presons/index.htmlで選択された 「20」を表示したいのですが、 そのコードの書き方をご教授ください。 どうぞよろしくお願い致します。

    • ベストアンサー
    • Ruby
  • rails3初心者 複数の絞込検索

    絞り込み条件で、メーカーやカテゴリを選択してから 金額指定があれば、金額指定も含めて検索結果を実装する事はできますか? またボタンは1個にする形にしたいです。 よろしくお願い致しますm(_ _)m 絞込み検索内容 ========== ・メーカー (チェックボックス式) ・カテゴリ (チェックボックス式) ・金額指定 ========== ==================== views: ==================== <p>条件検索(複数選択可)</p> <%= form_tag ({:controller => :products, :action => :check }), {:method => :get} do %> <p>メーカーから探す</p> <% Maker.all.each do |maker|%> <%= check_box_tag "maker_id[]", maker.id, (params[:maker_id].include?(maker.id.to_s) if params[:maker_id]) %> <%= maker.maker_name %><br /> <% end %> <p>カテゴリから探す</p> <% Category.all.each do |c| %> <%= check_box_tag "category_id[]", c.id, (params[:category_id].include?(c.id.to_s) if params[:category_id]) %> <%= c.name %><br /> <% end %><br /> <%= submit_tag "検索"%> #このボタンを外してひとつのボタンにしたいです。 <% end %> <p>金額を指定して絞り込む</p> <%= form_tag ({:controller => :products, :action => :search_price }), {:method => :post} do %>  <%= text_field_tag "price1",(params[:price1] if params[:price1]) %> ~   <%= text_field_tag "price2",(params[:price2] if params[:price2]) %> <%= submit_tag "検索"%> <% end %> ==================== products_controller.rb ==================== def check @product = Product.all if params[:maker_id] && params[:category_id]   # 両方選択された場合 @products = Product.where(:category_id => params[:category_id], :maker_id => params[:maker_id] ) elsif params[:maker_id]   #makerが選択された場合 @products = Product.where(:maker_id => params[:maker_id]) if params[:maker_id] elsif params[:category_id]   #カテゴリが選択された場合 @products = Product.where(:category_id => params[:category_id]) if params[:category_id] elsif params[:maker_id] == nil && params[:category_id] == nil   #両方ともチェックがなかった場合 @products = Product.all end render :action => 'check' end def search_price @products = Product.where('price >=? AND price <=?', params[:price1],params[:price2]) @products = Product.where('price >=?', params[:price1]) if params[:price2].blank? @products = Product.where('price <=?', params[:price2]) if params[:price1].blank? render :action => 'index' end ややこしくてすみません^^; どうぞよろしくお願い致します。

    • ベストアンサー
    • Ruby
  • rails3初心者 金額から絞り込み検索

    rails3を勉強中です。 ご教授いただけば幸いです。 実装したい事: DBに登録してあるproductsの一覧から金額を指定して絞り込み検索をしたい 解決してない事: indexに検索結果が表示されません。 コードの書き方をご教授いただければ幸いです。 ==================== views: ==================== <%= form_tag ({:controller => :products, :action => :search_price }), {:method => :post} do %> 価格指定 <%= text_field_tag "price1" %> ~  <%= text_field_tag "price2" %> <%= submit_tag "検索"%> <% end %> ==================== products_controller.rb ==================== def search_price @products = Product.all @product = Product.new @products.each do |product| item = product.price >= params[:price1].to_i && product.price <= params[:price2].to_i if item @product = product end end render :action => 'index' end ==================== views/products/index.html ==================== <% @products.each do |product| %> <%= product.name %> <%= product.price %> <% end %>

    • ベストアンサー
    • Ruby
  • Raild3でparamsによってRouting

    Rails3で、paramsによって動的にルーティングを変える方法はあるのでしょうか? 例えば、 <form action='/example/'> <input type='submit' name='action1'/> <input type='submit' name='action2'/> </form> こういう2つのsubmitボタンがあるフォームがあった場合、どちらのsubmitを押したかでactionを切り替えたいのです。 この場合は、params[:action1]またはparams[:action2]を見て、ルーティングの切り替えができるのかなと思っています。 何か方法はないでしょうか。

  • Rails 3 での動的更新について

    Ruby on Rails 3 を利用してウェブ開発をしているのですが、Rails 2 の時に利用できた動的更新が出来なくて困っています。 今回の質問の動的更新とは、テキストフィールドなどに入力があるとそれを検知して、コントローラー内の処理を呼び出して結果をページの一部として表示する、というものです。 Rails 2 の時には以下のようにしていました。 <script language="JavaScript"> <!-- function ShowRule() { $("#show_value").load("/[コントローラー名]/[メソッド名]?[パラメーター]="+document.[フォーム名].[ポスト名].value); } //--> </script> 値を返したい部分に <div id="show_value"></div> を置き、入力を監視したい項目に :onclick => "ShowRule()" のオプションをつけていました。 同じように記述したのですが、Rails 3(というか jquery)だと上手く動きません。上記のような処理を jquery で行う方法をご教授ください。 よろしくお願い致します。

  • Rails コンボボックスの値の保持について(select_tag,c

    Rails コンボボックスの値の保持について(select_tag,collection_select) こんにちは。 Ruby on Railsで簡単な一覧検索画面を作成中の者です。 検索時の検索条件にコンボボックスを使用しており、検索後にコンボボックスの値を保持したいのですが、どうしてもできません。 どなたかお分かりの方がおられましたらご教授いただけないでしょうか。 下記、作成中のソースです。 Viewの検索条件部 <%- form_tag({:action => "search"},{:method=> "GET"}) do -%> <th class="U" align="left" width="10%"><label for="userNm">ユーザー名</label></th> <td width="90%"><%= text_field_tag :userNm, @userNm %></td>  <th class="U" align="left" width="10%"><label for="authCd">社員権限</label></th> <td width="90%">  <%= collection_select(:auth, :authCd, Auth.find(:all, :order => "AUTH_CD"), :id, :AUTH_NM, :include_blank => true) %>  <td align="center"><%= submit_tag '検索' %></td> Controllerクラス: def search #画面パラメータから検索条件を作成 c = Condition.new # ユーザー名 userNm = "" if params[:userNm] userNm = params[:userNm] c.and "USER_NM", "LIKE", "%#{userNm}%" end # コンボボックスの値を取得 if params[:auth] && !params[:auth]["authCd"].blank? c.and "AUTH_CD", params[:auth]["authCd"] end # 検索処理 @users = User.paginate(:order => "USER_ID asc", :per_page => 5, :page => params[:page], :conditions => c.where) # 検索条件保持 @userNm = params[:userNm] # コンボボックスの値が保持できない if params[:auth] @auth_authCd = params[:auth]["authCd"] end respond_to do |format| format.html # index.html.erb format.xml { render :xml => @users } end end 見づらくて申し訳ありませんが、ざっと上記のようになっています。 もう1つの検索条件であるユーザー名(userNm)は保持できるのですが、コンボボックス(社員権限)の値が保持できません。 select_tagや、selectも使ってみたのですが、どちらも同じ結果でした。 コンボボックスの条件は、Authモデルから値を読込み、一番上は空白にする。というものです。 どのように記述すれば保持できるのか色々調べてみたのですが、結局分からず仕舞いでした。。 どうぞ宜しくお願い致します。

    • ベストアンサー
    • Ruby
  • ラジオボタンのチェックを判定したいです。

    phpとhtmlを使用して、ラジオボタンをいくつか作成したとします。 どのラジオボタンが選択されているかを判定する場合、通常ラジオボタンのvalueの値が、ある値と一致するかどうかで判定しますが、そうではなく、逆にチェックが入っているラジオボタンのvalue値を取得したい場合、どのようにすればいいのでしょうか? ちなみに、javascriptは使用したくないです。理由は、その値を再びphpの画面で使いたいからです。 もし、javascriptで取得した値をphpの画面に渡せれば、javascriptを使用してもOKなのですが、なかなか上手く渡せないようなので。。。 ご教授お願い致します。

    • ベストアンサー
    • PHP
  • Rails3でAjaxを使いたい

    どなたが知識をご教授下さい。 Rails3でAjaxのごく普通のハイパーリンクを作成したいのですが、うまくいきません。 /users/index.html.erb <div id="hoge"> <%= link_to "ajax",{:action => 'draw'},:remote => true %> </div> -- /users/_draw.html.erb ~いろいろ内容~ -- /users/draw.js.erb $('#hoge').html("<%= escape_javascript(render :partial => 'draw' )%>"); -- /users_controller.rb def draw ~いろいろ処理~ end -- ルーティング match 'users/draw' => 'users#draw' -- application.html.erb <%= javascript_include_tag :defaults %> -- gemfile gem 'jquery-rails' 以上のように処理するよう様々なサイトや書籍にはありましたが、「Templete Missing」のエラーが出てしまいます。かれこれ5時間以上ハマってまして、、、 どなたか知識をご教授頂けたら幸いです。 *メモ アクションdrawに渡ったときに、 「request.xhr?がfalse」ということは、ajax通信できていないということでしょうか???

    • ベストアンサー
    • Ruby
  • JSPでのサブミット判定

    JSPでサブミットが押された時、このような判断をするといったプログラムの記述方法をしりたいのですが、 例えば、 <input type="submit" value="送信">というサブミットボタンを、 if(?){ 実行したい処理 } といった感じで判断したいのですが、?の部分の記述の仕方がわかりません。 もしよろしければ教えていただけないでしょうか?

  • rails3初心者 検索対象に別テーブルも含めたい

    ご教授よろしくお願いします。 <実装したい事> productテーブルからmakerテーブルのmaker_nameカラムも検索条件に含めたい。 (productテーブルの検索対象カラムは:codeとname ) (makerテーブルの検索対象カラムは:maker_name ) 以下のコードで試してみましたが、実装できません。 ========================= views ========================= <%=form_tag({:controller => :products,:action => :search}, :method => :get) do %> <%= text_field_tag "search_form",params[:search_form],:size =>25 %> <%= submit_tag '商品検索' %> <% end %> ======================================== products_controller.rb ======================================== def search @products =Product.find(:all, :include => :maker, :conditions =>['maker.maker_name like :value or code like :value or name like :value', {:value=> '%' +params[:search_form]+ '%'}]) end ======================================== リレーションシップ ======================================== product.rb belongs_to :maker **************************** maker.rb has_many :products **************************** どうぞよろしくお願い致します。

専門家に質問してみよう