質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

0回答

1667閲覧

【rails】collectionで宣言したアクションでajaxを実現する方法

eizo

総合スコア6

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2018/05/07 02:01

前提・実現したいこと

railsのajaxに関して質問があります。
collectionで宣言したアクション「search」にjsのformatを要求すると「missing a template for this request format and variant」というエラーが出ます。
この原因がわからず困っています。

発生している問題・エラーメッセージ

ActionController::UnknownFormat in ShopsController#search ShopsController#search is missing a template for this request format and variant. request.formats: ["text/html"] request.variant: []

該当のソースコード

該当のルーティングの設定

ruby

1 devise_for :shops, module: :shops 2 resources :shops, only: [:index, :show] do 3 member do 4 get :info 5 get :job_offer 6 get :story 7 get :checkin 8 end 9 collection do 10 post :search 11 end 12 end

該当のview

html

1 <%= form_tag({:controller => '/shops', :action => 'search'}, method: "post", name: "latlng", :remote => true) do %> 2 <%= hidden_field_tag 'latitude' %> 3 <%= hidden_field_tag 'longitude' %> 4 <% end %> 5 <div class="currentLocation"></div> 6 <nav id="global-nav"></div>

該当のcontroller

ruby

1 def search 2 lat = params[:latitude] 3 lng = params[:longitude] 4 5 @shops = Shop.all.within(0.1, origin: [lat, lng]).by_distance(origin: [lat, lng]) 6 # @shops = Shop.by_distance(origin: [lat, lng]).limit(10) # 近い順で返す 7 8 # binding.pry 9 10 respond_to do |format| 11 format.html 12 format.js 13 end 14 end

該当のjsファイル(コントローラーから呼んでいるファイル)

js

1 $('#global-nav').html("<%= j (render 'search') %>");

関係するjQueryのコード(remoteを設定したformのattrに値をセットしsubmit)

js

1 // チェックイン機能 2 $('.currentLocation').on("click", function() { 3 if(navigator.geolocation) { 4 navigator.geolocation.getCurrentPosition(successGetPosition, failGetPosition, options); 5 } else { 6 message = 'ご使用中のブラウザは現在地検索に対応されておりません。'; 7 alert.set('warning', message); 8 } 9 10 function successGetPosition(position) { 11 // URLで緯度経度を渡す場合 12 // window.location.href = "/shops/search?latitude="+position.coords.latitude+"&longitude="+position.coords.longitude; 13 14 // formで緯度経度を渡す場合 15 $('input[name="latitude"]').attr('value', position.coords.latitude); 16 $('input[name="longitude"]').attr('value', position.coords.longitude); 17 document.latlng.submit(); 18 } 19 function options() { 20 timeout : 10000; //単位ms(10秒) 21 maximumAge : 0; //単位ms 22 enableHighAccuracy = true; 23 } 24 function failGetPosition(error) { 25 if(error.code == 1) { 26 message = '位置情報の提供を許可してください。'; 27 } else if(error.code == 2) { 28 message = '位置情報の取得に失敗しました。'; 29 } else { 30 message = '位置情報の取得に失敗しました。'; 31 } 32 alert.set('warning', message); 33 } 34 });

該当のjsファイルでrenderしているコード

html

1<ul> 2 <li><a href="#">test1</a></li> 3 <li><a href="#">test2</a></li> 4 <li><a href="#">test3</a></li> 5</ul>

試したこと

コントローラーから呼び出すjsファイルをいったん削除し、htmlファイルを用意し、コントローラーから要求すると問題なく実行されました。そのためjsファイルの呼び出し方が正しくないのでは???と考えています。
(collectionで設定したアクションの場合、jsファイルの呼び出し方が異なるとかありますでしょうか?)

補足情報(FW/ツールのバージョンなど)

rails -v 5.0.6

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問