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

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

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

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

Haml

Haml(HTML abstraction markup language)は、HTML/XHTMLを効率的に記述するためのマークアップ言語および記法です。

Ruby on Rails

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

JavaScript

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

jQuery

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

Q&A

解決済

1回答

2329閲覧

【Ruby on Rails + jQuery】$.ajaxによってコントローラに送って返された値がundefinedとなる

shota-imoto

総合スコア37

Ruby on Rails 5

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

Haml

Haml(HTML abstraction markup language)は、HTML/XHTMLを効率的に記述するためのマークアップ言語および記法です。

Ruby on Rails

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

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2020/05/15 12:07

解決したいこと

非同期の検索機能を実装したい。

状況

想定される流れ

  1. railsのview中のフォームで入力された文字を取得し、$.ajaxによってrailsのcontrollerに送信。
  2. controller中で検索した値をjson.jbuilderを通してjavascriptファイルに返す。
  3. 返された値を用いてrailsのviewファイルに表示する

うまくいっていること

  • keyupによる発火。
  • railsのcontrollerファイルへのデータ送信
  • controllerファイルでの検索機能。format.jsonの直前でインスタンス変数@instrumentsの中には検索された値が含まれていた。

うまくいかないこと

  • 流れの2.の部分で返される値がundefined

ソースファイル

search.js

jquery

1$(function () { 2 # 省略。別画面で用いる検索機能に関する記述であるため。 3 4 function instrumentCandidate(result) { 5 var html = `<div class"search-result__instrument-candidate", data-instrument_id="${result.id}">${result.name}</div>`; 6 7 return html; 8 } 9 10 $("#search_instrument_name").on("keyup", function () { 11 var input = $("#search_instrument_name").val(); 12 if (input == "") { 13 $(".content__search-result").empty(); 14 return; 15 } 16 $.ajax({ 17 type: "get", 18 url: "/instruments/search", 19 data: { 20 keyword: input, 21 }, 22 dataType: "json", 23 }).done(function (results) { 24 // ここでコンソール表示をしているresultsがundefinedとなっている 25 console.log(results); 26 $(".content__search-result").empty(); 27 var insertHTML = ""; 28 29 $.each(results, function (i, result) { 30 console.log(result); 31 32 insertHTML += instrumentCandidate(result); 33 if (i == 4) return false; 34 }); 35 36 $(".content__search-result").append(insertHTML); 37 }); 38 }); 39});

routes

rails

1Rails.application.routes.draw do 2# 省略 3 resources :instruments, except: :index do 4 collection do 5 get :search 6 end 7 end 8 resources :tuning_alls, except: :show 9 resources :finger_alls, except: :show 10end

instruments_controller.rb

rails

1class InstrumentsController < ApplicationController 2 def search 3 params[:keyword].strip! 4 keywords = params[:keyword].split(/\s/) 5 @instruments = Instrument.all 6 keywords.each do |keyword| 7 @instruments = @instruments.where("name like ?", "%#{keyword}%") 8 end 9 10 respond_to do |format| 11 # ここでbinding.pryを用いて@instrumentsの中身を調べた値を下に示す。 12 format.html 13 format.json 14 end 15 end 16end

terminal

1 Instrument Load (0.3ms) SELECT `instruments`.* FROM `instruments` WHERE (name like '%b%') 2 ↳ app/controllers/instruments_controller.rb:22 3=> [#<Instrument:0x00007f85ef8d5230 4 id: 1, 5 name: "5strings banjo", 6 total_string: 5, 7 created_at: Thu, 14 May 2020 22:54:09 JST +09:00, 8 updated_at: Thu, 14 May 2020 22:54:09 JST +09:00>]

search

jbuilder

1json.array! @songs do |song| 2 #省略。別の検索機能で用いる記述のため 3end 4json.array! @instruments, :id, :name, :total_string

instrumentテーブル

instrumentテーブル

new.view(参考)

この画面で検索した結果を表示します。
結果データと、ユーザーがフォームで記入した内容をcreateアクションに送信する機能を実装する予定です。

rails

1.content 2 =form_with url: tuning_alls_path, method: :post, local: true do |f| 3 .content__instrument-name 4 =f.text_field :instrument_name, id: "search_instrument_name", placeholder: "楽器名称" 5 =f.text_field :instrument_id, class: "form_blind" 6 .content__search-result 7

仮説と検証

json.jbuilderの記述ミス

理由

コントローラの時点ではインスタンス変数に正常にデータが格納されている。また$.ajaxに接続しているメソッドdone自体は動作しているため、コントローラ→jqueryの間にあるjbuilderファイルが怪しい。

###試した記述
参考サイト

jbuillder

1json.array! @instruments do |instrument| 2 json.id instrument.id 3 json.name, instrument.name 4 json.total_string instrument.total_string 5end

jbuilder

1json.instrument do 2 json.array! instruments, :id, :name, :total_string 3end

結果

変化なし


正直、何が何やらという感じです。
うまく動作している非同期の検索機能のソースを見て比較してみましたが違いも見当たりません。

お力いただけると幸いです。

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

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

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

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

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

guest

回答1

0

自己解決

railsのコントローラ→json.jbuilderファイルへのルーティング

誤りの記述

jbuilder

1json.array! @songs do |song| 2 #省略。別の検索機能で用いる記述のため 3end 4json.array! @instruments, :id, :name, :total_string

問題点

controller→jbuilderファイルへのルーティング

  • コントローラと同じ名称のviewフォルダ直下に、コントローラ内に記述した関数と同じ名がついたjson.jbuilderファイルを用意し、そこにjbuilderの記述を行う必要があった。
  • 「誤りの記述」のように記述することで@songのコントローラ内で用意したsearchアクションも動作しなくなっていた。

正しい記述

  • ディレクトリ名称:

views > instruments > search.json.jbuilder

jbuilder

1json.array! @instruments, :id, :name, :total_string
  • ディレクトリ名称:

controllers > instruments_controller.rb

rails

1# 定義された名前が重要↓ 2def search 3 params[:keyword].strip! 4 keywords = params[:keyword].split(/\s/) 5 @instruments = Instrument.all 6 keywords.each do |keyword| 7 @instruments = @instruments.where("name like ?", "%#{keyword}%") 8 end 9 10# これは定番の書き方 11 respond_to do |format| 12 format.html 13 format.json 14 end 15end

rails×json.jbuilderファイルに関する情報は日本語だとあまりネットで見当たらないので解決出来てよかったです。

投稿2020/05/16 01:05

shota-imoto

総合スコア37

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問