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

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

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

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

JavaScript

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

Q&A

解決済

1回答

1663閲覧

コード番号を入力してデータベースから値を参照して表示できない

begenner

総合スコア79

Ruby on Rails

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

JavaScript

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

0グッド

1クリップ

投稿2018/01/14 08:46

現在ECサイトを作成しています。
注文画面で商品のコード番号を入力すると

  1. データベースをコード番号をpostして情報を取得
  2. 取得した値をフォームのテキストボックスに表示させたい

のですがうまくいきません。

わかる方がいらっしゃればよろしくお願いします。

###動作環境
OS:mac
Ruby:2.3.5
Ruby on Rails: 4.2.5
MySQL: 5.7.18
###期待する動作

  • データベースにコード番号をpostして情報を取得、取得した値をフォームのテキストボックスに表示させたい

###エラー詳細(terminalのログ画像)

イメージ説明
ブラウザのコンソールエラーメッセージ
イメージ説明

###問題点

  • データベースにコード番号をpostして情報をテキストボックスに表示できない

###参考にしたサイト
Railsでajaxを用いた簡単なインクリメンタルサーチを実装する

###該当のソースコード
db/schema.rb

ruby

1#注文明細テーブル 2 create_table "orderdetails", force: :cascade do |t| 3 t.integer "order_id", limit: 4 4 t.integer "code_no", limit: 4#商品コード 5 t.string "product_name", limit: 255#商品名 6 t.integer "quantity", limit: 4#数量 7 t.float "price", limit: 24#価格 8 t.string "unit", limit: 255#単位 9 end 10#注文テーブル 11 create_table "orders", force: :cascade do |t| 12 t.string "order_no", limit: 255 13 t.integer "user_id", limit: 4 14 end 15#商品テーブル 16 create_table "productuserrank0s", force: :cascade do |t| 17 t.integer "code_no", limit: 4#商品コード 18 t.string "product_name", limit: 255#商品名 19 t.string "unit", limit: 255#単位 20 t.integer "standard_price", limit: 4#価格 21 end

config/routes.rb

ruby

1Rails.application.routes.draw do 2 resources :orders do 3 get 'search_product' 4 end 5 6 resources :productuserrank0s 7 8 root to: 'tops#index' 9end 10

リレーション

ruby

1#app/models/order.rb 2class Order < ActiveRecord::Base 3 belongs_to :user 4 has_many :orderdetails 5 accepts_nested_attributes_for :orderdetails, reject_if: lambda {|attributes| attributes['code_no'].blank?} 6end 7#app/models/orderdetail.rb 8class Orderdetail < ActiveRecord::Base 9 belongs_to :order 10end

app/controllers/orders_controller.rb

ruby

1class OrdersController < ApplicationController 2 def new 3 @order = Order.new 4 5 (1..10).each do |num| 6 @order.orderdetails.build 7 end 8 @submit = "注文する" 9 end 10. 11. 12 def search_product 13 @product = Productuserrank0.where('code_no LIKE(?)', "#{params[:keyword]}") 14 render json: @product 15 end 16. 17. 18end 19

app/views/orders/new.html.erb

ruby

1<%= form_for (@order), html:{id: 'form'} do |f|%> 2 <p>注文内容</p> 3 <%= f.fields_for :orderdetails do |orderdetail, s | %> 4 <tr> 5 <td><%= orderdetail.text_field 'code_no', :size => "5"%></td> 6 <td><%= orderdetail.text_field 'product_name', disabled: 'disabled' %></td> 7 <td><%= orderdetail.text_field 'quantity', :size => "3" %></td> 8 <td><%= orderdetail.text_field 'price', :size => "7", disabled: 'disabled' %></td> 9 <td><%= orderdetail.text_field 'sub_total', :size => "7", disabled: 'disabled' %></td> 10 </tr> 11 <% end %> 12 <%= f.hidden_field :user_id, value: current_user.id %> 13 <br /> 14 <div class="actions"> 15 <%= f.submit %> 16 </div> 17<% end %>

app/assets/javascript/orders.js

ruby

1// 1番目の入力項目 2 //(コードNo) 3 $(document).on('turbolinks:load', function(){ 4// var strId = 0; 5 $('#order_orderdetails_attributes_0_code_no').change(function () { 6 var input = ($(this).val()); 7 $.ajax({ 8 url: '/orders/search_product', 9 type: 'GET', 10 data: ('keyword=' + input), 11 processData: false, 12 contentType: false, 13 dataType: 'json' 14 }) 15 .done(function(data){ 16 $(data).each(function(i, product){ 17$("#order_orderdetails_attributes_0_product_name").val(product.product_name) 18$("#order_orderdetails_attributes_0_unit").val(product.unit) 19$("#order_orderdetails_attributes_0_price").val(product.selling_price1) 20 }); 21 }); 22 }); 23 24 25});

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは。

エラーの起こる原因は、routes.rb

resources :orders do get 'search_product' end

としているところです。
ここの get 'search_product' で追加されるルーティングは

GET /orders/:order_id/search_product

というものです。これは、rails routes で確認できます。
ですので、orders.js の $.ajax で呼んでいる、

GET /orders/search_product

は、意図しているルーティングが作らていなくて、したがって、keyword パラメータのついた

GET /orders/search_product?keyword=1

も意図している、OrdersController#search_product にルーティングされず、
その結果、/orders/の後のsearch_product が注文IDと解釈されて、
注文詳細の OrdersController#show にルーティングされてしまっています。
そのために、以下の showアクション(メソッド)が、OrdersControllerに無い旨の
メッセージが出ています。

イメージ説明

意図したルーティングを実現するには、以下のように、
get '/orders/search_product', to: 'orders#search_product'
を、resources :orders よりも前に書けばよいと思います。

Rails.application.routes.draw do get '/orders/search_product', to: 'orders#search_product' resources :orders  ・・・ end

ただし、ご質問に挙がっている、OrdersController#search_product
コードを読むと、該当する商品の一覧が返されるメソッドなので、直感的には

GET /products?keyword=xxxx   またはモデル名にあわせて、 GET /productuserrank0s?keyword=xxxx

をキーワードつき商品検索API のエンドポイントにして、これを

Productuserrank0sController#index

にルーティングさせるほうがよいような気もしました。

以上参考になれば幸いです。


補足

質問の「期待する動作」に

 データベースにコード番号をpostして情報を取得、取得した値をフォームのテキストボックスに表示させたい

とありますが、上記の "postして" は、HTTPリクエストのPOSTメソッドのことでしょうか?
order.js では GETで呼んでいるので、少し気になりました。

投稿2018/01/14 10:21

編集2018/01/14 10:56
jun68ykt

総合スコア9058

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

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

begenner

2018/01/15 06:07

とてもわかりやすい解説ありがとうございました。 おかげさまで期待通りの動作ができました。 ありがとうございます(^^)
jun68ykt

2018/01/15 06:16

解決されたようで、よかったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問