Rails3でAjaxを使いたい

このQ&Aのポイント
  • Rails3で普通のハイパーリンクを作成するためにAjaxを使用したい
  • Ajax通信がうまくいかずに「Template Missing」のエラーが発生している
  • アクションdrawに渡ったときにrequest.xhr?がfalseとなり、Ajax通信ができていない可能性がある
回答を見る
  • ベストアンサー

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
  • 回答数2
  • ありがとう数7

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

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

こちらの環境では、正しく動作しています。 CentOS release 5.6 (Final) Rails 3.0.10 ruby 1.9.2p180 (2011-02-18 revision 30909) [i686-linux] request.xhr?はこちらではtrueになっています。 ですので、rails.jsとjquery.jsの何れかが不正のような気がします。 念のため、以下のようにしてみてください。 (ファイルを置き換えるので、バックアップは取っておいてください) 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は上書きする) 上記のようにしてやってみてください。そのようにすると、こちらでは正しく動作します。 特に、prototype.jsとjquery.jsは共存させないほうが安全です。

mizunoke88
質問者

お礼

ご教授ありがとうございます。 Started GET "/users/draw" for 127.0.0.1 at Sun Oct 30 18:56:48 +0900 2011 Processing by UsersController#draw as JS -もろもろ処理- Rendered users/_draw.html.erb (0.6ms) Rendered users/draw.js.erb (2.3ms) Completed 200 OK in 148ms (Views: 14.1ms | ActiveRecord: 2.4ms) と、正常っぽい動きになりました!!!!ありがとうございます! ですが、依然画面が切り替わりません。。 (ちなみにrequest.xhr?は、今は0でコンソールに表示されています。。) 何か、思い当たることはありませんか???

その他の回答 (1)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

#1です。 >ですが、依然画面が切り替わりません。。 >(ちなみにrequest.xhr?は、今は0でコンソールに表示されています。。) >何か、思い当たることはありませんか??? まず、request.xhr?は、今は0でコンソールに表示されていますとのことですが、 これは、trueかfalseのはずです。(こちらはtrueで表示されます) コントローラの def drawのメソッドの中で p request.xhr? とすると、その内容が表示されますが、その結果が0なのでしょうか? 依然画面が切り替わりません。ということですが、 ajaxは、同一画面で、画面内の一部を更新する機能です。 ですので、その前提で回答します。(質問者様が全く別の画面に切り替わることを期待はしていないと理解しています) 今回、切り替えの対象になるのは、 <div id="hoge"> <%= link_to "ajax",{:action => 'draw'},:remote => true %> </div> のhogeのIDを持つ部分です。 ですから、上記の定義ではなく、 <div id="hoge">XXXX</div> <%= link_to "ajax",{:action => 'draw'},:remote => true %> のように定義し、 XXXXの部分を $('#hoge').html("<%= escape_javascript(render :partial => 'draw' )%>"); で、置き換えることになります。 users/_draw.html.erbの ~いろいろ内容~ の部分が、置き換えの対象になります。 1.コントローラのdefメソッドの全て 2.以下のview /users/index.html.erb /users/_draw.html.erb /users/draw.js.erb の<div id="hoge"に関する部分の全て が提示されれば、問題が解決するかも知れません。

mizunoke88
質問者

お礼

どうもご返事ありがとうございます! 解決致しました!! #1さんがおっしゃるように、/users/draw.js.erb を開示すべきでした。。お手数おかけして申し訳ございませんでした。 結局/users/draw.js.erbの中で、別の関数を読んでいたのですが、記述方法に誤りがありました。。 以後、内容は詳しく記載するように致します。それにしてもprototype.jsとjquery.jsが共存するだけで動かない、rails.jsを書き換える、こういったことまで頭がまわらず、一人では解決できなかった部分でしたので、知識をご教授頂けて幸いです!! どうもありがとうございました!!

関連するQ&A

  • Rails3でのルーティングの書き方

    Ruby1.9.3とRails3.2.9の環境でのルーティングではまってしまっているので、御経験のある方、御教示ください。現在、 config/routes.rbに Sample::Application.routes.draw do resources :users resources :tasks match '/users/login' match '/users/logout' match ':controller(/:action(/:id))' match ':controller(/:action(/:id))(.:format)' end を記述して、WEBrickを起動して、 http://localhost:3000/users/login/ を実行すると、このアドレスには移動するのですが、 NoMethodError in Users#show Showing C:/user/Ruby193/rails/sample/app/views/users/show.html.erb where line #5 raised: のエラーが出ます。 WEBrickの表示を見てみると、 Started GET "/users/login/" for 127.0.0.1 at 2013-01-22 22:56:06 +0900 Processing by UsersController#show as HTML Parameters: {"id"=>"login"} Rendered users/show.html.erb within layouts/users (2.0ms) Completed 500 Internal Server Error in 5ms となっていて、/users/login/をGETしているのですが、アクションでshowが呼び出されて、そのIDとして loginが渡っているように見えます。 現在、users\controller.rbのshowの関数の定義は全てコメントアウトしています。usersコントローラの def login関数の定義と、app/views/users/login.html.erbも置いているのですが、それらが表示されない状態で原因が分かりかねています。 上記のルーティングの書き方に何か問題があるのでしょうか?

    • ベストアンサー
    • Ruby
  • Ruby on Rails に関する質問です。

    Ruby on Rails でデータベースにあいまい検索を複数条件でかけたいのですが、どのようにしたらよいのでしょうか?? def find   @bookinfo= Bookinfo.find(:all, :conditions => ["title like ?" => ["author like ?", "%#{params[:key]}%"]]) render :action => 'result.html.erb' end このような感じで複数のあいまい検索をかけたいのですがどのようにすればよいのか教えてください。 お願いします。SQLite3を使用しています。

    • ベストアンサー
    • Ruby
  • ajaxが難しいです。

    1 if (xhr.status === 200) { result.textContent = xhr.responseText; の部分がわからないのですが 自分で作った変数resultの中に通信に両方成功した場合サーバ側のPHPが生成したDOM要素を代入するという事をやっているのでしょうか? その結果、処理結果を表記するhtml<div id="result"></div>の中に、代入された中身が表記されるという事ですか? 2 下記のloadstartとloadなどう違うのでしょうか? xhr.addEventListener('loadstart', function() { // 画面に通信中と表記 result.textContent = '通信中...'; }, false); // 画面に通信中と表記 xhr.addEventListener('load', function() { result.textContent = xhr.responseText; }, false); 下記ソース ・ <?php sleep(3); print('こんにちは、'.$_REQUEST['name'].'さん!'); print('こんにちは、'.$_REQUEST['name2'].'さん!'); ?> ・ <!DOCTYPE html> <html> <head> <meta name="robots" content="noindex,noimageindex,nofollow"><!-- Onlysample --> <meta charset="UTF-8" /> <title>JavaScript本格入門</title> </head> <body> <form> <label for="name">名前:</label> <input id="name" type="text" name="name" size="15" /> <input id="btn" type="button" name="submit" value="送信" /> <label for="name">名前2:</label> <input id="name2" type="text" name="name2" size="15" /> <input id="btn2" type="button" name="submit" value="送信" /> </form> <div id="result"></div> <div id="result2"></div> <script src="scripts/hello_ajax.js"></script> </body> </html> // 非同期通信を行うための準備 document.addEventListener('DOMContentLoaded', function() { document.getElementById('btn').addEventListener('click', function() { var result = document.getElementById('result'); var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { if (xhr.readyState === 4) { if (xhr.status === 200) { result.textContent = xhr.responseText; } else { result.textContent = 'サーバーエラーが発生しました。'; } } else { result.textContent = '通信中...'; } }; /* xhr.addEventListener('loadstart', function() { result.textContent = '通信中...'; }, false); xhr.addEventListener('load', function() { result.textContent = xhr.responseText; }, false); xhr.addEventListener('error', function() { result.textContent = 'サーバーエラーが発生しました。'; }, false); */ xhr.open('GET', 'hello_ajax.php?name=' + encodeURIComponent(document.getElementById('name').value), true); xhr.send(null); }, false); document.getElementById('btn2').addEventListener('click', function() { var result = document.getElementById('result2'); var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { if (xhr.readyState === 4) { if (xhr.status === 200) { result.textContent = xhr.responseText; } else { result.textContent = 'サーバーエラーが発生しました。'; } } else { result.textContent = '通信中...'; } }; /* xhr.addEventListener('loadstart', function() { result.textContent = '通信中...'; }, false); xhr.addEventListener('load', function() { result.textContent = xhr.responseText; }, false); xhr.addEventListener('error', function() { result.textContent = 'サーバーエラーが発生しました。'; }, false); */ xhr.open('GET', 'hello_ajax.php?name2=' + encodeURIComponent(document.getElementById('name2').value), true); xhr.send(null); }, false); }, false); 最後に、クリックした際にJSでDOM生成して、新たな要素を表記することとajaxは、 閲覧者からすると同じように見えるのですが、 違いは、ajaxはブラウザ上で生成したのではなく、 サーバ側のPHPが生成したDOM要素をダウンロードして代入するという、違いでしょうか? つまりサーバ側でDOMを作ったらajax、ブラウザ上で作ったらただのDOM生成という事ですか?

  • Rails2.3でのserver/script再起動について

    Rails2.3でのserver/script再起動について 2.2.2を利用していたのですが、2.3.5へアップデートしようとしています。 rails 2.3.5のインストールは無事、完了し、プロジェクトを作成しました。 controller名を「hoge」にて、server/scriptにてwebrickを起動しました。 次にcontrollerにて、indexアクションを作成し、viewにて対応するindex.html.erbを作成しました。 ブラウザにて、http://localhost:3000/hoge/indexにアクセスすると、 「Template is missing」となってしまいます。 webrickを再起動し、再度アクセスすると正常に表示されます。 rails 2.2.2までは、development環境下では、 viewのファイル追加では再起動が不要だった(config以下は必要だった)と認識しているのですが、 rails 2.3では再起動が必要になったのでしょうか?ちなみにmongrel 1.1.5で行っても同じでした。 どなたかご教授お願いいたします。

  • JQueryはAJAXとは無関係??

    質問◆JQueryおよびJQueryMobileは「AJAX」とは無関係なのでしょうか? 「JQueryMobileを使っているとき、DOMによってHTMLを動的に差し替えている」という認識なのですが、 特にRequest関連の記載をJavaScriptで記載していない限り、AJAXの処理は行われないのでしょうか? それとも、 JQuery Mobileを使っている場合は、ページ遷移などで、プログラマが意識していなくても(独自にプログラムを書いていなくても) AJAXの処理が行われているのでしょうか? /************************************/ サーバへのリクエストはなくても、1つのマシン内の、HTMLファイルとHTMLファイルの間で、 HTTPで通信がされるということはないと思っています。 (※基本、HTTPはクライアントとサーバの間のときしか使われないのですよね?) JQueryの技術情報のサイトを見ていると、 よく「document.ready」と書かれていたりするソースを見かけますが、 これはAjaxとは関係なく(通信とは関係なく)、 また「xhr.send」も書かれていないHTMLは、AJAXは使われないという理解です。 (「Form、submit」とも関係がない) XMLHttpRequestも「HttpRequest」とあるわけですし、 「Form、submit」を書いているときに行われるわけではないけれども、かわりに、 「xhr.send」とJavaScriptで実行されたタイミングで走る処理であり、 その際、「サーバから返される情報がXMLのデータ形式で(XML以外もですが、、)」だという理解なのですが、合っていますでしょうか?

    • ベストアンサー
    • AJAX
  • 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 で行う方法をご教授ください。 よろしくお願い致します。

  • ajax後、php,mysqlも一部再読み込み?

    通常は一部でも変更が加わるとページの全てを再読み込みしますが、ajaxを利用すると、変更を加えた部分だけが再読み込みされるところまでは理解しています。 分からないところは、各プログラムへの動作がajaxを使った後の場合と通常の場合ではどのように違うのかです。 下記のような考え方で正しいですか?説明が下手で読みにくく申し訳ないですが、アドバイスをいただけたら嬉しいです。お願いします。 ■htmlは、実行を起こした部分を含めその子要素全てが再読み込みの対象に。  例えば、↓の<div#ajax>~</div>この間にある子要素の全てが再読み込みされる。それ以外のhtmlやcssは再読み込みされない。 ■cssは、htmlと同じで、その部分で使われているcssが対象。 ■javascriptは、ajaxの場合と通常の場合で違いはなく、常に全てが再読み込みされる(外部ファイル、記述の位置に関係なく)。 ■jquery、php、mysqlも、javascriptと同じで何一つ変わりなく通常通りに動く。 <?php ・includeで外部ファイルを取得 ・様々な処理 ・mysqlに接続して様々な処理 ?> <html> <head> <script type="text/javascript" src="外部ファイルでajaxを記述"></script> <title></title> </head> <body> <?php ・様々な処理 ?> <div id="main">  <div id="a">    <dl>~</dl>  </div>  <div id="ajax" onclick="ajaxの処理へ">    <table>~</table>    <ul>~</ul>    その他様々な処理  </div>  <p>~</p>  <img src=""> </div> <script type="text/javascript"> </script> </body> </html>

    • ベストアンサー
    • AJAX
  • jquery ajax 外部html 読み込み

    現在、数年前にjquery(v1.4.3)を用いて制作したページの更新を行っており それに伴いjqueryも最新版(v1.11.1)への移行を試している最中なのですが ajaxの外部htmlを読み込む処理が実行されなくなり困っております。 旧バージョンとではメソッドの記述法が異なることは理解できておりますが 色々と書き換えてみたものの、以前のように動作させる事ができません。 以下がそれぞれの記述になりますが、もし問題にお気付きになられましたら ご指摘いただけますと幸いです。 jquery(v1.4.3): function loadAdd(obj){ $.ajax({ async: true, type: 'GET', url: tgtURL, dataType: 'html', cache: false, success: function(html){ var $div = $("#add"); $div.html(html); }, error: function(xhr, status, errorThrown){ alert("not found."); } }); } jquery(v1.11.1): function loadAdd(obj){ $.ajax({ async: true, type: 'GET', url: tgtURL, dataType: 'html', cache: false, }) .done(function(html){ var $div = $("#add"); $div.html(html); }) .fail(function(xhr, status, errorThrown){ alert("not found."); }); }

    • ベストアンサー
    • AJAX
  • ajaxでエラー処理

    お世話になります。 prototype.jsを使ってajaxのエラー処理を考えております。 そこで質問なのですが、以下のソースで OK.phpでは正常に処理が行われ、 NG.phpでは強制的にonFailure処理を行わせたいと考えております。 PHP側(NG.php)で、操作出来ませんでしょうか? よろしくお願いいたします。 <html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <script type="text/javascript" src="prototype.js"></script> <script type="text/javascript"> <!-- function ajax(fName) { var filename = fName + "?cache="+(new Date()).getTime(); new Ajax.Request(filename, { method: "get", onSuccess: displayData, onFailure: displayError }); } function displayData(httpObj) { $("result").innerHTML = httpObj.responseText; } function displayError(httpObj) { $("errMsg").innerHTML = httpObj.responseText; } // --> </script> </head> <body> <input type="button" value="正常処理" onClick="ajax('OK.php')"><br> <input type="button" value="エラー処理" onClick="ajax('NG.php')"><br> <div id="result"></div> <div id="errMsg"></div> </body> </html>

  • ajaxの使いどころ

    現在、会員制のWebサービスを作成しています。 まだ初期段階ですが、今は管理者用のユーザー管理ページに着手しており、サーバーサイド、クライアントサイド合わせて、およそ7割程度完成しているいるところです。 このページの現時点での実装では、ユーザーの削除、復活、パスワードリセット、登録情報の変更、新規ユーザーの登録といった全機能でajaxを使っています。 また、処理対象のユーザーは一覧のテーブルをクリックして選択するのですが、このクリック時にサーバーからユーザーの詳細情報を取得しており、ここでもajaxを使っています。 要するに、1ページ取得したあと、そのページ内でサーバーと通信を行う必要が生じたら、それはすべてajaxを使うという決まりです。 そこで、ajaxの運用についていくつかわからない点があり、質問させて頂きます。 (1) 会員専用ページという性質を考えると、ajaxでリクエストを送信した際にも、サーバーサイドではそのリクエストに対するセッションが有効かどうかをチェックする必要がありますよね? 一般的な会員向けWEBサービスでは、"ページ遷移毎"だけでなく、"ajaxでの通信毎"でもセッションのチェックを行うものなのでしょうか。 (2) ajaxでの通信時にセッションの有効性をチェックした結果、すでにタイムアウト等でセッションが無効な場合、一般的にはどうするべきなのでしょうか。 個人的にはlogoutページにリロードしたいと考えているのですが、このようにするには、サーバー側がレスポンスを返すときに、{error:{code:'1',message:'session_out'}}のようなJSONを返して、それをjavascript側で確認し、location.hrefを書き換える、というような流れで処理を行うことになるのでしょうか。 (3) そもそも、今回のように「1ページ内で生じるサーバー間通信は全てajaxで補う」という考え方は、一般的なものなのでしょうか。 なにが言いたいかというと、"セキュリティ等を考慮してajaxを使うべきではない処理"と"ajaxを積極的に使うべき処理"(もしくは、"ajaxを使っても差し支えない処理")の判断の仕方、つまり、ajaxの使いドコロがよく分かっていません。 以上3点につきまして、ご教授いただければ幸いです。

    • ベストアンサー
    • AJAX

専門家に質問してみよう