前提・実現したいこと
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
あなたの回答
tips
プレビュー