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

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

詳細はこちら
Ruby on Rails 5

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

2回答

387閲覧

レコードのid が取得できない

sunny_garden

総合スコア6

Ruby on Rails 5

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2019/12/09 11:34

#解決したいこと
form_tag にインクリメンタルサーチでインプットしたレコード情報(都市名)を用いて、
show アクションで個別の都市の情報ページへ遷移したいが、idを取得できないため、遷移できない。
個別都市名が入力されたあと、Enterキーをおすと、path には確かにid が入っていない(以下の通り)

localhost:3000/jpcities/show?utf8=✓&keyword=宇都宮

#エラー表示の内容

ActiveRecord::RecordNotFound in JpcitiesController#show Couldn't find Jpcity with 'id'=show Extracted source (around line #23): def show @jpcity = Jpcity.find(params[:id]).jpkanji #ここがエラー end

#これまでに試したこと
1)form_with を使用してみたが、自動的にpostアクションになってしまうため不適切。

2)JSにconsole.log(jpcityId)と書いてみたところ、"undefined" と表示される。

3)search.html.haml の、 = form_tag("jpcities/show", method: :get) do を、
form_tag(jpcity_path", method: :get) do に改めると、同様のエラーが出る、など。

ActionController::UrlGenerationError in Jpcities#search Showing /Users/mac/projects/syncronicity/app/views/jpcities/search.html.haml where line #12 raised: No route matches {:action=>"show", :controller=>"jpcities"}, missing required keys: [:id]

JSではid を取得するコードを書いているが、意味をなしていない様子((2)の通り)

方法として考えたのは、

①入力された都市名をid に変換する。

②JSでid を取得して(現状、console.log(jpcity)と書くと、まるっと入力された都市の情報が取れているが・・)、
それをフォームsubmit時にpathに反映させる(都市名を反映させるのではなく)。

しかし両者ともインターネットを渉猟したものの、解決方法を編み出すことはできなかった。

#ファイルの詳細
##jpcities.controller

class JpcitiesController < ApplicationController def index end def search @jpcity_name = Jpcity.where('jpkanji LIKE(?)', "%#{params[:keyword]}%").limit(6) @jpcity_hira = Jpcity.where('hira LIKE(?)', "%#{params[:keyword]}%").limit(6) @jpcity_alpha = Jpcity.where('alphabet LIKE(?)', "%#{params[:keyword]}%").limit(6) if @jpcity_name != [] @jpcities = @jpcity_name elsif @jpcity_hira != [] @jpcities = @jpcity_hira else @jpcities = @jpcity_alpha end respond_to do |format| format.html format.json{render json:@jpcities} end end def show @jpcity = Jpcity.find(params[:id]).jpkanji end def jpcity_params params.require(:jpcity).permit( :pref, :jpkanji, :simplified, :hira, :alphabet, :latitude_id, jpcity2_attributes:[ :latitude, :longitude, :pref, :income, :r_price, :popul, :size, :dense, :jpcity_id, :latitude_id ] ) end end

#search.js

$(function(){ var search_list = $("#jpcity-search-result-latitude"); function AppendJpcitiesName(jpcity){ var html = `<div class="jpcity-name-stage-lat"> <p class="jpcity-name">${jpcity.jpkanji}</p> <a class="jpcitiy-name__id" type = "hidden" data-jpcity__id="${jpcity.id}"></a> </div>` search_list.append(html); } $(function(){ $(".clearfix_lat").on("keyup", function(){ var input = $(".clearfix_lat").val(); var preWord; if (input !== preWord){ $.ajax({ type: 'get', url: '/jpcities/search', data: { keyword: input }, dataType: 'json' }) .done(function(jpcities) { $(search_list).empty(); if(input != "") { $(search_list).show(); jpcities.forEach(function(jpcity){ AppendJpcitiesName(jpcity); }); } else { $(search_list).hide(); $(search_list).empty(); } preWord = input; }) } }) }) }) $(function(){ var search_list = $("#jpcity-search-result-climate"); function AppendJpcitiesName(jpcity){ var html = `<div class="jpcity-name-stage-cli"> <p class="jpcity-name">${jpcity.jpkanji}</p> <a class="jpcitiy-name__id" type="hidden" data-jpcity__id="${jpcity.id}"></a> </div>` search_list.append(html); } $(function(){ $(".clearfix_cli").on("keyup", function(){ var input = $(".clearfix_cli").val(); var preWord; if (input !== preWord){ $.ajax({ type: 'get', url: '/jpcities/search', data: { keyword: input }, dataType: 'json' }) .done(function(jpcities) { $(search_list).empty(); if(input != "") { $(search_list).show(); jpcities.forEach(function(jpcity){ AppendJpcitiesName(jpcity); }); } else { $(search_list).hide(); $(search_list).empty(); } preWord = input; }) } }) }) $(document).on("click", ".jpcity-name-stage-lat", function () { var jpcityId = $(this).data("jpcity__id"); var jpcityName = $(this).text().trim(); $(".search-form-lat").empty(); $(".search-form-lat").val(jpcityName); $(".jpcitiy-name__id").val(jpcityId); $("#jpcity-search-result-latitude").empty();     console.log(jpcityId) }); $(document).on("click", ".jpcity-name-stage-cli", function () { var jpcityId_cl = $(this).data("jpcity__id"); var jpcityName_cl = $(this).text().trim(); $(".search-form-cl").empty(); $(".search-form-cl").val(jpcityName_cl); $(".jpcitiy-name__id").val(jpcityId_cl); $("#jpcity-search-result-climate").empty(); }); })

##search.html.haml(一部抜粋)

%p.jp-search-field__middle__stage__latitude 任意の日本の都市名をご入力ください^^ .jp-search-field__middle__stage__latitude__form-box .jp-search-field__middle__stage__latitude__form-box__form = form_tag(jpcity_path, method: :get) do %input.search-form-lat{name:"keyword", placeholder: "日本の都市名", type: "text", class:'clearfix_lat',style:'padding-left:10px;'} %label.search-icon.submit-stage = fa_icon 'search fa-lg',class:'submit' #jpcity-search-result-latitude %p.jp-search-field__middle__stage__climate

##jpcity.rb

class Jpcity < ApplicationRecord has_one :jpcity2 has_one :jpclimate accepts_nested_attributes_for :jpcity2 accepts_nested_attributes_for :jpclimate end

##テーブル
md(!cd22e011378b46b8955179f80569509d,0.707182320441989)

jpcity2以降のテーブルは、speakerdeck にアップロードできないため割愛します。

##routes.rb

Rails.application.routes.draw do # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html root to: 'jpcities#search' resources :jpcities do collection do get 'search' end end resources :chcities # collection do # get 'chcities/search' defaults: { format: 'json' } # end # end end

##バージョン
ruby 2.5.1
Rails 5.2.3

以上です。何卒よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

検索結果からとりこんでいるのがnameだけに見えます。
idもhiddenに取り込んでおいて、それを返すようにしましょう。

投稿2019/12/09 12:28

winterboum

総合スコア23567

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

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

sunny_garden

2019/12/10 11:45

ご回答ありがとうございます。JSを動かす前に、form_tag(jpcity_path", method: :get) do に改めると、同様のエラーが出るという状況のため、まずこれを直すことから入りたいと思います。
winterboum

2019/12/10 11:46

form_tag(jpcity_path",   ダブルコーテーションがありますが、これ?
guest

0

補足(自己解決ではありません):
path を手入力すると、遷移します。
例:http://localhost:3000/jpcities/34
これで、show.html.haml に書いてある hello! が表示されます。

投稿2019/12/09 11:37

sunny_garden

総合スコア6

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問