🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails 5

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

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

JavaScript

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

Slim

SlimはPHPアプリケーションを開発するための軽量なマイクロフレームワークです。

Google マップ

Google Mapは、Google社がオンラインで提供している地図・ローカル検索サービスです。GIS(Geographic Information System:地理情報システム)の中の「WebGIS」に該当します。地図・航空写真・地形の表示方式があり、それぞれユーザーが縮尺を調整して表示させることができます。地域の情報サービスを検索する機能やルート検索の機能も搭載されています。

Q&A

解決済

2回答

815閲覧

undefined local variable or method エラーを解消したいです

t.togashi

総合スコア22

Ruby on Rails 5

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

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

JavaScript

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

Slim

SlimはPHPアプリケーションを開発するための軽量なマイクロフレームワークです。

Google マップ

Google Mapは、Google社がオンラインで提供している地図・ローカル検索サービスです。GIS(Geographic Information System:地理情報システム)の中の「WebGIS」に該当します。地図・航空写真・地形の表示方式があり、それぞれユーザーが縮尺を調整して表示させることができます。地域の情報サービスを検索する機能やルート検索の機能も搭載されています。

0グッド

0クリップ

投稿2019/09/16 13:18

編集2019/09/16 13:19

前提・実現したいこと

ruby on railsのアプリにおいて、Google Maps APIを使用し、マップと、マップ上に複数のマーカー表示をしようとしています。

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

複数のマーカーを表示できるよう、javascript内にeach文を配置したところ、以下のエラーが発生しました。

エラーメッセージ

undefined local variable or method `damage' for #<#<Class:0x00007ff93a5b1b30>:0x00007ff93b5ccc68> Did you mean? @damages

エラー箇所

position: {lat: #{damage.latitude} , lng: #{damage.longitude} },

該当のソースコード

index.html.slim

.page-title 被害一覧 = link_to '被害の新規登録', new_damage_path, class: 'btn btn-primary' table.table.table-hover.index-table thead.thead-light tr th = Damage.human_attribute_name(:title) th = Damage.human_attribute_name(:place) th = Damage.human_attribute_name(:amount) th = User.human_attribute_name(:department) th = User.human_attribute_name(:name) th tbody - @damages.each do |damage| tr td = link_to damage.title, damage_path(damage), class: 'damage-title' td = damage.place td = damage.amount&.to_s(:delimited) td = damage.user.department td = damage.user.name - if damage.user_id == current_user.id td = link_to '編集', edit_damage_path(damage), class: 'btn btn-primary' - else td = tr td = "合計" td = "#{@total_place}箇所" td = @total_amount.to_s(:delimited) td = td = td = #map javascript: var map; function initMap() { var target = document.getElementById('map'); // 中央に表示する座標 var center = {lat: 38.698953,lng: 139.925736} map = new google.maps.Map(target, { center: center, zoom: 10 }); //複数のマーカーを表示するための記載 - @damages.each do |damage| //マーカー var marker = new google.maps.Marker({ position: {lat: #{damage.latitude} , lng: #{damage.longitude} }, map: map, title: "#{damage.title}", icon: ( "#{damage.description}".indexOf('現地確認未了') == -1 ) ? "http://maps.google.com/mapfiles/ms/micons/red-dot.png" : "http://maps.google.com/mapfiles/ms/micons/blue-dot.png" }); } script async="" defer="defer" src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDD8_DF2AUAtXfZVcQYFUi3T3AslQKAXaw&callback=initMap"

試したこと

インデントの深さを確認しましたが、問題はないと認識しています。

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

javascript文の外側であるtbody- @damages.each do |damage| と同じ記載方法をしているのですが、tbodyに置いてはエラーは発生していません。

Google Maps APIの使用に再しては、以下のサイトの情報を参考にさせて頂きました。
https://qiita.com/yamaotoko4177/items/30b72766d013904452fa
http://www.webdesignleaves.com/pr/plugins/googlemap_01.html

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

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

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

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

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

guest

回答2

0

エラーメッセージの表現が JS のものに見えません。
メッセージがどのfileのどの行かというのが一緒にあると思います。そこも見せて下さい。
ああ、
map 以下のcodeはその上のindexと思われる slimの中に書かれているのでしょうか?

だとすると
position: {lat: "#{damage.latitude}" , lng: "#{damage.longitude}" },
かもしれない

投稿2019/09/16 14:00

winterboum

総合スコア23567

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

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

t.togashi

2019/09/16 14:08

こんばんは。 >map 以下のcodeはその上のindexと思われる slimの中に書かれているのでしょうか? 仰るとおりです。
winterboum

2019/09/16 14:10

position: {lat: "#{damage.latitude}" , lng: "#{damage.longitude}" }, を試してみて下さい
t.togashi

2019/09/16 22:07

おはようございます。 ご連絡くださりありがとうございました。 ご教示いただいたコードを試してみたのですが、エラーは解消されませんでした。 エラーメッセージ ``` undefined local variable or method `damage' for #<#<Class:0x00007faa74506740>:0x00007faa7444e050> Did you mean? @damages ```
winterboum

2019/09/16 23:23

ああ、、 position: {lat: "#{damage.latitude}" , lng: "#{damage.longitude}" }, の部分が rubyの式であることが宣言されてないですね。 さて、、、 slim の中の javascript の中でどう宣言するのだろう。erbでは経験ありますがslimでは未経験です。 その辺りをkeyに検索してみて下さい。
Mugheart

2019/09/17 01:06

普段Rails使っててHTML内に直接JavaScript書かないのでよくわかってないですけど 問題はjavascriptを書くべきところにRubyのコードが書かれていることじゃないですかね? 具体的には以下の箇所なんですけど - @damages.each do |damage| これって勝手にjsのコードに変換されるんですか?多分されないはず。
winterboum

2019/09/17 01:10

erbで<%= %><% %>で囲めばやってくれるのは経験済ですが、slimではやったことがないのでどうなるものやら、、、
Mugheart

2019/09/17 01:20

やるなら@damagesをどっかのタグにデータとして渡しておいて、それに対してjsでループ回すとかじゃないとうまくいかないかなと思います。
Mugheart

2019/09/17 01:24

> <%= %><% %>で囲めばやってくれる なるほど、サンプルコードって書けますか?
Mugheart

2019/09/17 01:36 編集

ちょっと調べてきました。 slimだと#{raw @damages.to_json}に対して順当にjsでfor文を書く他ないみたいですね。 var damages = #{raw @damages.to_json}; for(var i = 0; i < damages.length; ++i) { ... ; } こんな感じかな。
guest

0

ベストアンサー

coffeeの方が見易いかなと思ってcoffeeで書いてみました。
動作確認はしてないので参考程度にしてください。

slim

1javascript: 2 damages = #{raw @damages.to_json}; 3coffee: 4 for key, damage of damages 5 marker = new (google.maps.Marker)( 6 position: 7 lat: damage.latitude 8 lng: damage.longitude 9 map: map 10 ... 11 )

投稿2019/09/17 02:30

Mugheart

総合スコア2349

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問