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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/22 01:44
2020/04/22 01:49
2020/04/22 02:00
2020/04/22 02:42
2020/04/22 04:22
2020/04/22 07:33
2020/04/22 09:31