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

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

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

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

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

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

Q&A

解決済

1回答

2428閲覧

【rails】コントローラで定義した変数をapplication.js.erbで使いたい【javascript】

shi6na

総合スコア14

Ruby on Rails

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

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

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

0グッド

0クリップ

投稿2018/08/31 13:57

編集2018/09/01 09:16

Ruby on railsにて、コントローラで作成した値(変数)をjsで使いたいです。

流れとしては、

  1. form.html.erbからonChangeでapplication.js.erbのfuntionName()を呼び出し
  2. functionName()内からhogeコントローラのwriteアクションに値を送信
  3. 送られてきた値をもとに、writeアクション内で変数作成
  4. functionName()にて作成された変数を使用してセレクトボックスの内容を変更

となります。

以下、簡略化した大体のコードです。

html

1<!-- form.html.erb --> 2 <%= Gon::Base.render_data %> 3 <div class="main"> 4 <p>○○</p> 5 <%= form_for :hoges, html:{name: "hoges"} do |f| %> 6 <!--選択肢その1--> 7 <p><%= f.select :name ,@namae ,{:prompt => "選択してください" }, :onchange => "functionName()"%></p> 8       <!--onChangeでjsのfuntionName()呼び出し--> 9 <!--選択肢その2(選択肢その1の項目によって変化)--> 10 <select name = "selectName2"> 11 </select> 12 <input type="submit" name="commit" value="検索" class="button" data-disable-with="検索" onclick="return checkForm();"> 13 <% end %> 14 </div> 15

Javascript

1//application.js.erb 2(前略) 3function functionName() 4{ 5var select1 = document.hoges.hoges_name; //functionName()を呼び出したセレクトボックスをselect1とする 6var select2 = document.hoges.selectName2; //select2は変数に応じて選択肢を変えたい 7 8select2.options.length = 0; 9 10$.ajax({ 11 url: "/hoges/write", //writeアクションに値を送信 12 type: "GET", 13 data: {content : select1.value} //↑セレクトボックスで選択された内容を送信 14}) 15.done(function( data ) { 16 console.log("成功だよ"); 17}) 18.fail(function( data ) { 19 console.log("失敗だよ"); 20}) 21.always(function( data ) { 22 console.log("通信完了だよ"); 23}); 24 25 for(var i=0; i<gon.name.length; i++){ 26 select2.options[j] = new Option(@name[i],@code[i]); //ここでコントローラの変数(値)を使いたい 27 } 28} 29

ruby

1#hoges_controller.rb 2class HogesController < ApplicationController 3 4 require 'net/http' 5 require 'uri' 6 require 'json' 7 8 def form 9 (form.html.erb用の処理)(略) 10 end 11 12 def write 13 @text = params.require(:content) 14 url = "https://○○/api/v1/names?Code=#{@text.to_i}" 15 uri = URI.parse(url) 16 (中略、APIから情報を取得する処理) 17 @result = JSON.parse(res.body) #result=API取得結果 18 19 @result.length.times do |j| 20 @name[j] = @result[j][name] #ここで変数作成 21 @code[j] = @result[j][code] 22 end 23 end 24 25(以下略)

ちなみに、gonを使用するための <%= include_gon(init: true)%>はapplication.html.erbの<head>内に記載してあります。(上記コードではapplication.html.erbは割愛しております)

詰まっている箇所

gon変数を使おうとし、functionName()を呼び出した後、Ajax通信が完了(成功)するのを見計ってconsoleでgon変数名やgon.allを叩いてもundefinedとなってしまいます。
コントローラが同じでも、定義するアクションが違えばやはりgon変数は有効でなくなってしまうのでしょうか。
(9/1追記)js.erb形式なのでコントローラで作った変数が<%= @変数名 %>で使えるとのことだったので(上記コードはその方向で修正してあります)、試してみましたが、変数の中身が無いような挙動をします。(例:console.log(<%= @変数名 %>);とすると空白行が出力される)
変数を定義する場所がまずいのでしょうか?

また、上記以外にもコントローラで作成した変数をjsで使える方法がありましたらご教授頂けますと幸いです。

ちなみに

(大元のやりたいことは、1つめのセレクトボックスの入力値によって異なるAPIから取得した値が2つめのボックスの選択肢になるコンボボックス(?)です。もっとシンプルで分かりやすい方法あるよ!などもありましたら頂けるとありがたいです。)

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

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

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

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

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

guest

回答1

0

自己解決

ajax通信のレスポンス(返り値?)に入れてしまうのが早いと思い、render json: 変数名 で
コントローラで処理した情報をjs側に投げ返しました。

投稿2018/09/22 13:08

編集2018/09/22 13:10
shi6na

総合スコア14

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問