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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Geolocation

Geolocation(ジオロケーション)は、携帯電話やインターネットに接続したコンピューターターミナルなど、オブジェクトの現実世界での地理的位置の情報を扱う技術であり、位置評価の実施や、実際に評価された位置を示す場合もあります。

Ruby on Rails

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

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

Q&A

解決済

1回答

1037閲覧

Javascriptの変数をrailsのコントローラーに渡したい

tomololol

総合スコア1

Geolocation

Geolocation(ジオロケーション)は、携帯電話やインターネットに接続したコンピューターターミナルなど、オブジェクトの現実世界での地理的位置の情報を扱う技術であり、位置評価の実施や、実際に評価された位置を示す場合もあります。

Ruby on Rails

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

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

0グッド

0クリップ

投稿2021/10/20 17:49

前提・実現したいこと

Geolocation APIで現在地から緯度経度を取得して、railsのコントローラー内で処理を行いたいです。
Javascriptの変数をajaxを用いてコントローラーに渡そうとしていますが、上手くいきません。

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

binding.pryで確認するとlatitude, longitudeが0.0となってしまいます。アラートで表示させてみたところちゃんと緯度経度が出たので、現在地の取得はできていると思います。ajaxでの受け渡しに問題があるのは分かるのですが調べても間違いが分からず、どなたか教えて頂けると嬉しいです。rails6.1.3です。

エラーメッセージは特にありません。

該当のソースコード

html

1<script type="text/javascript"> 2 if (navigator.geolocation) { 3 navigator.geolocation.getCurrentPosition( 4 5 function(position){ 6 $.ajax({ 7 url: "/maps/new", 8 type: "GET", 9 dataType: 'html', 10 async: true, 11 data: {latitude : position.coords.latitude, 12 longitude : position.coords.longitude, 13 } 14 }); 15 } 16 ) 17 } 18</script>

controller

1def new 2 latitude = params[:latitude].to_f 3 longitude = params[:longitude].to_f 4end

試したこと

いろいろ調べて試してみましたがJavascriptの理解が進んでおらず、解決できませんでした、、、

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

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

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

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

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

guest

回答1

0

ベストアンサー

どこに問題があるのかの原因を特定するためのコード追加を挙げます。

diff

1 if (navigator.geolocation) { 2 navigator.geolocation.getCurrentPosition( 3 4 function(position){ 5+ const data = { 6+ latitude: position.coords.latitude, 7+ longitude: position.coords.longitude, 8+ }; 9+ console.log(`data: ${JSON.stringify(data)}`); 10 $.ajax({ 11 url: "/maps/new", 12 type: "GET", 13 dataType: 'html', 14 async: true, 15- data: {latitude : position.coords.latitude, 16- longitude : position.coords.longitude, 17- } 18+ data, 19+ success: html => { 20+ console.log(`response: ${html}`); 21+ }, 22+ error: (xhr, textStatus, errorThrown) => { 23+ console.log('xhr:'); 24+ console.log(xhr); 25+ console.log(`textStatus: ${textStatus}`); 26+ console.log(`errorThrown: ${errorThrown}`); 27+ } 28 }); 29 } 30 ) 31 }

???? 参考:Codepen (※ajaxのurlはダミーのAPIに変えています)

  • $.ajax({・・・}) を実行する直前で、dataオブジェクトを作り、これをconsole.logで出力させ、latitude と longitude に想定通りの値が入っているかを確認します。

  • $.ajax({・・・})に渡しているパラメータに、success と error を追加します。これで GET /maps/new のリクエストが成功しているのか失敗しているのかが分かります。

  • また、失敗のときは、エラー情報をconsole.logで出力させます。

これで実行してみて、想定どおりではないログが出力されたら、そこから原因を推測して、修正すべき部分を特定していきます。

投稿2021/10/20 21:54

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

tomololol

2021/10/21 19:23

とても詳しく有難うございます。実行してみたところ、コンソールにはhtml情報が表示されたので、受け渡しも出来ているようです。ただ、 controller @latitude = params[:latitude].to_f html <%= @latitude %> とすると、0.0が表示されてしまいます。 コンソールには </script> 11.111111(現在地)と表示されています。これは、何か設定を間違えているのでしょうか?それとも、そもそもajaxでこのような書き方は出来ないのでしょうか。
退会済みユーザー

退会済みユーザー

2021/10/23 00:50

当方フロントエンド専業者でありまして、Railsはあまり詳しくはありませんが、たしか、Railsで新しいプロジェクトを rails g scaffold ・・・とかやってテンプレートを作ったときに、 /maps/new のような /new のパスには空の登録フォームのHTML全体が返されるんだったと思います。そのデフォルトの状態のままだとすると、HTML全体を返すリクエストを Ajax から呼ぶのは、Ajaxの使い方としてはナンセンスというかほぼやらないです。 ちなみに、現状のコードで、 > コンソールにはhtml情報が表示されたので、受け渡しも出来ているようです。 とのことなので、Ajax からのGET /maps/new は成功しているものと思いますが、受け取ったHTMLを画面側のDOMに何らか反映させる処理をしないと、Ajaxによるレスポンスが画面に反映されることは無いです。 ちなみに、Ajax でリクエストされる想定のパスにルーティングされるコントローラのメソッドによって返されるのは、HTML全体ではなくHTMLの一部であるか、もしくはJSONやXMLだったりすることが通常です。JSONやXMLを返す場合、そのURL(とリクエストとレスポンスの仕様)のことをAPI と言ったりします。 最近の Rails には APIモードというのもあるらしいですね。ご興味あれば調べてみるのもよいでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問