Ruby on railsにて、コントローラで作成した値(変数)をjsで使いたいです。
流れとしては、
- form.html.erbからonChangeでapplication.js.erbのfuntionName()を呼び出し
- functionName()内からhogeコントローラのwriteアクションに値を送信
- 送られてきた値をもとに、writeアクション内で変数作成
- 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つめのボックスの選択肢になるコンボボックス(?)です。もっとシンプルで分かりやすい方法あるよ!などもありましたら頂けるとありがたいです。)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。