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

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

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

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

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

1110閲覧

Railsで楽天APIで商品検索ができるようにしたのですが、form_tagでcreateアクションにidが飛ばせません。

mnhy613

総合スコア21

Ruby on Rails

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

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/04/21 16:05

編集2020/04/22 02:25

form_tagを使ってidがnilにならないようにしたい。

Railsで楽天APIの検索バーを作り、そこで検索した結果が並ぶようにはできました。
並んだ商品1つ1つに商品登録ボタンをform_tagで作り、hidden_fieldで商品の画像や名前はカラムに入るのですが、肝心のidが入ってくれません。

商品を登録するボタンを押した後にcreateアクションに飛んで、データを保存し、リダイレクトでshowアクションに飛んでから、商品詳細ページに飛んで欲しいのですが、エラーが出ます。

No route matches {:action=>"show", :controller=>"chocolates", :id=>nil}, missing required keys: [:id]

このようなエラーが出ます。

そもそも楽天の商品にidのようなものがないのかと思い、binding.pryで調べていくと
idらしきものがあったので、下記のようなコードで無理やりidカラムに入れたつもりだったのですが

_chocolate_list.html.erb

1<% if @items.present? %> 2 <% @items.each do |good| %> 3 <div class="list"> 4 <% if good.medium_image_urls[0] %> 5 <%= link_to (image_tag(good.medium_image_urls[0], style: "width: 120px;height: 100px;display: inline-block;")) %> 6 <%end%></br> 7 8 <%= good.name %> 9 10 ¥<%= good.price %> 11 12 <% good.tag_ids[0] %> 13 14 <%= form_tag(chocolates_path, method: :post) do %> 15 <%= hidden_field_tag :medium_image_url, good.medium_image_urls[0] %> 16 <%= hidden_field_tag :rakuten_chocolate_name_url, good.name %> 17 <%= hidden_field_tag :price, good.price %> 18 <%= hidden_field_tag :chocolate_id, good.tag_ids[0].to_h %> 19 <h4>メーカー名</h4> 20 <%= select_tag 'brand_id', options_for_select([['メーカー名を必ず選択して下さい'],['明治'], ['ロッテ'],['江崎グリコ'], ['森永'],['ネスレ'], ['マース'],['モンデリーズ'], ['フェレロ'],['ハーシー'], ['リンツ&シュプリングリー'],['その他']],:selected=>"メーカー名を必ず選択して下さい"), class: "brand_class" %> 21 <%= submit_tag "商品を登録する", class: "btn btn-primary" %> 22 <% end %> 23 </div> 24 <% end %> 25<% end %>

メーカー名の上の<%= hidden_field_tag :chocolate_id, good.tag_ids[0].to_h %>

このコードで入ったのではと思っていたのですが

binding.pryの結果がこれです。

[1] pry(#<ChocolatesController>)> @chocolate.errors => #<ActiveModel::Errors:0x000055ad2f642350 @base= #<Chocolate:0x000055ad2fd02398 id: nil, name: nil, url: nil, asin: nil, price: 1968, official_url: nil, brand_id: "明治", taste: nil, healthy: nil, cost_performance: nil, created_at: nil, updated_at: nil, content: nil, chocolate_image_id: nil, rakuten_chocolate_name_url: "【おまけつきます☆】明治ハイミルクチョコBOX26枚×6箱入夏季期間中クール便となり別途300円かかります。", medium_image_url: "https://thumbnail.image.rakuten.co.jp/@0_mall/okasirenjya/cabinet/0341

chocolateコントローラは下記のようにしています。

chocolate_controller

1class ChocolatesController < ApplicationController 2 def new 3 4 end 5 6 def index 7 @chocolates = Chocolate.all 8 end 9 def show 10 @chocolate = Chocolate.find(params[:id]) 11 end 12 def create 13 14 @chocolate = Chocolate.new(chocolate_params) 15 16 binding.pry 17 @chocolate.save 18 19 redirect_to chocolate_path(@chocolate.id) 20 end 21 22 def search 23 if params[:keyword] 24 25 @items = RakutenWebService::Ichiba::Item.search(keyword: params[:keyword]) 26 end 27 28 end 29 30 31 private 32 33 def chocolate_params 34 params.permit(:rakuten_chocolate_name_url, :medium_image_url, :price, :brand_id, :chocolate) 35 end 36end

ヒントをいただければ幸いです。

ブラウザ上はこんな感じで登録するボタンを作っています。

イメージ説明

rails routesの結果

search_chocolates GET /chocolates/search(.:format) chocolates#search chocolates GET /chocolates(.:format) chocolates#index POST /chocolates(.:format) chocolates#create new_chocolate GET /chocolates/new(.:format) chocolates#new edit_chocolate GET /chocolates/:id/edit(.:format) chocolates#edit chocolate GET /chocolates/:id(.:format) chocolates#show PATCH /chocolates/:id(.:format) chocolates#update PUT /chocolates/:id(.:format) chocolates#update DELETE /chocolates/:id(.:format) chocolates#destroy

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

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

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

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

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

guest

回答1

0

ベストアンサー

  1. <%= hidden_field_tag :, good.tag_ids[0].to_h %>

ここの to_h が意味不明です。good.tag_ids[0] ってどういう値をしていますか
0. logをみるとどういうparameterが渡ったかがわかります。そこで"chocolate_id"=> にどういう値が入っているかみてください
0. No route matches {:action=>"show", :controller=>"chocolates", :id=>nil}, missing required keys: [:id] というエラーは、form_tag(chocolates_path,に問題があるのですが、chocolates_path と複数形なのが気になります。rails routes の結果を見せてください

投稿2020/04/21 22:51

winterboum

総合スコア23284

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

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

mnhy613

2020/04/22 01:44

アドバイスありがとうございます。 rails routesの結果の写真も編集して載せますので、ご確認いただければと思います。 また、form_tagではモデルにidが保存されないということはありますでしょうか? form_forと違って、できないのではないかと考えています。 その認識はあっていますでしょうか?
mnhy613

2020/04/22 01:49

chocolates_path と複数形なのが気になります。 →私もおかしいなと思い、chocolateにするとidがnilだと吐き出され他ので、やむなくchocolatesにして、楽天の検索結果が複数出てくるから、複数じゃないといけないんだと納得させていました。
winterboum

2020/04/22 02:00

そのたぐいは写真貼るのはやめてほしいな。回答に使うときにコピペもできないし。 複数形でcreateになってますね。 1、2,の回答は?
mnhy613

2020/04/22 02:42

1の回答です。 @params= {"mediumImageUrls"=> ["https://thumbnail.image.rakuten.co.jp/@0_mall/okasirenjya/cabinet/03411380/05183106/imgrc0072663138.jpg?_ex=128x128", "https://thumbnail.image.rakuten.co.jp/@0_mall/okasirenjya/cabinet/03411391/04200661/imgrc0062145308.jpg?_ex=128x128"], "pointRate"=>1, "shopOfTheYearFlag"=>0, "affiliateRate"=>8, "shipOverseasFlag"=>0, "asurakuFlag"=>0, "endTime"=>"", "taxFlag"=>0, "startTime"=>"", "itemCaption"=>"ミルクがハイっ! ", "catchcopy"=>"", "tagIds"=>[1003822, 1013328], tagIdsにはこのような数値が入っていました。 [0]なので1003822です。 2についてです [2] pry(#<ChocolatesController>)> @chocolate => #<Chocolate:0x00007f23c00ff560 id: nil, name: nil, url: nil, asin: nil, price: 1968, official_url: nil, brand_id: "明治", taste: nil, healthy: nil, cost_performance: nil, created_at: nil, updated_at: nil, content: nil, chocolate_image_id: nil, rakuten_chocolate_name_url: "【おまけつきます☆】明治ハイミルクチョコBOX26枚×6箱入夏季期間中クール便となり別途300円かかります。", medium_image_url: "https://thumbnail.image.rakuten.co.jp/@0_mall/okasirenjya/cabinet/03411380/05183106/imgrc0072663138.jpg?_ex=128x128"> このような結果になりました。 アドバイスよろしくお願いします。 reils routesもコードに直しました
winterboum

2020/04/22 04:22

なぜ pry で見るんですか。「logをみると」と書いてあるでしょう。 回答者は仮説をたて、それを絞り込む・検証するために追加情報を求めています。 違うことをされても役に立ちません
mnhy613

2020/04/22 07:33

logの意味がわかっていませんでした。すみません。 ターミナルに出てくるこちらのことでいいでしょうか? Started GET "/chocolates/search?utf8=%E2%9C%93&keyword=%E6%98%8E%E6%B2%BB%E3%80%80%E3%83%9F%E3%83%AB%E3%82%AF%E3%83%81%E3%83%A7%E3%82%B3" for 10.0.2.2 at 2020-04-22 07:32:13 +0000 Cannot render console from 10.0.2.2! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 (2.3ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC ↳ /var/lib/gems/2.5.0/gems/activerecord-5.2.4.2/lib/active_record/log_subscriber.rb:98 Processing by ChocolatesController#search as HTML Parameters: {"utf8"=>"✓", "keyword"=>"明治 ミルクチョコ"} Rendering chocolates/search.html.erb within layouts/application Rendered chocolates/search.html.erb within layouts/application (359.5ms) Completed 200 OK in 1589ms (Views: 1575.5ms | ActiveRecord: 0.0ms) Started POST "/chocolates" for 10.0.2.2 at 2020-04-22 07:32:22 +0000 Cannot render console from 10.0.2.2! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 Processing by ChocolatesController#create as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"Yeloh1+pVLkHFrdn4Z6fY3/nfU1WBwdP4FBO5kbM5yPRZOjGogcJrj8iroO3dQTLe9aV9bPcJIwwboIBKzKQkQ==", "medium_image_url"=>"https://thumbnail.image.rakuten.co.jp/@0_mall/okasirenjya/cabinet/03411380/05183106/imgrc0072663138.jpg?_ex=128x128", "rakuten_chocolate_name_url"=>"【おまけつきます☆】明治ハイミルクチョコBOX26枚×6箱入夏季期間中クール便となり別途300円かかります。", "price"=>"1968", "brand_id"=>"明治", "commit"=>"商品を登録する"} Unpermitted parameters: :utf8, :authenticity_token, :commit (0.1ms) begin transaction ↳ app/controllers/chocolates_controller.rb:17 (0.4ms) rollback transaction ↳ app/controllers/chocolates_controller.rb:17 Completed 500 Internal Server Error in 112ms (ActiveRecord: 8.3ms) ActionController::UrlGenerationError (No route matches {:action=>"show", :controller=>"chocolates", :id=>nil}, missing required keys: [:id]): app/controllers/chocolates_controller.rb:19:in `create'
winterboum

2020/04/22 09:31

なにかsaveできない問題があって、saveに失敗していますね rollback transaction というのがでています。 ですので、 chocolate_path(@chocolate.id) の @chocolate.id が nilとなり問題のエラーになっています。 saveに成功したか否かで動きを変える必要があります
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問