前提・実現したいこと
Ruby on Railsで簡易的なサービスを作っています。
実現したい流れは以下の通りです。
検索窓で商品名を打ち込む→検索結果(商品 + 追加ボタン)を表示→
追加ボタンを押してコメント入力する→ユーザーのページ(show.html.erb)にその商品の画像を表示する
です。
ここでの「追加ボタンを押す」は、投稿に当たるため、posts_controlerを作りcreateメソッドで処理しようと考えたのですが、どのようにモデルを渡せばいいのか分からず詰まってしまっています。
こちらの右側の空白に、「商品名」「商品画像」「商品へのコメント」を表示したいです。
コメントの処理は追加ボタンの上にtext_fieldで良いかなと思っています。後に、jQueryのモーダルで処理したいと考えています。
発生している問題・エラーメッセージ
Amazonの商品はproduct.rb(商品モデル)として存在し、title, url, image_urlのカラムを持っています。post.rbはuser_idとcontentカラムを持っていて、belongs_to: user, belongs_to: productを書いています。
エラーメッセージ
該当のソースコード
_product_list.html.erb(検索結果の表示,商品の追加(投稿)の処理のためのビュー)
<% if @products.present? %> <% @products.each do |product| %> <div class="list"> <%= link_to (image_tag(product.image_url, style: "width: 80px;height: 100px;display: inline-block;")), product.url %> <div class="product-title"> <%= product.title %> </div> <div class="add-reco"> <%= form_for @post do |f| %> <!--<#%= f.text_field :content %>--> <%= f.submit "追加", class: "btn btn-primary" %> <% end %> </div> </div> <% end %> <% end %>
posts_controller.rb(投稿する処理をしたいcreateメソッド)
class PostsController < ApplicationController before_action :authenticate_user!, only: [:create, :destroy] def create #@product = Product.find(params[:title]) @post = current_user.posts.build @user = User.find_by_id(params[:id]) if @post.save flash[:success] = "投稿が完了しました!" redirect_to user_path(@user) else flash[:danger] = "投稿できませんでした" end end def destroy end private def post_params params.require(post).permit(:content, :title, :image_url, :url) end end
products_controller.rb(検索結果の表示と投稿のための処理)
class ProductsController < ApplicationController before_action :authenticate_user!, :except => [:search] def search @post = current_user.posts.build if params[:keyword].present? # デバックログを出力するために記述 Amazon::Ecs.debug = true #Amazon::Ecs::Responseオブジェクトの取得(amazon-ecsのitem_searchメソッドを利用し、検索した結果をproductsに格納する) products = Amazon::Ecs.item_search( params[:keyword], search_index: 'All', dataType: 'script', response_group: 'ItemAttributes, Images', country: 'jp' ) # 商品のタイトル、画像のURL、詳細ページURLの取得 @products = [] products.items.each do |item| product = Product.find_or_initialize_by(title: item.get('ItemAttributes/Title')) product.title = item.get('ItemAttributes/Title') product.image_url = item.get('LargeImage/URL') product.url = item.get('DetailPageURL') if product.save @products << product else render :search end end end end def create #@product = Product.find(params[:title]) @post = Product.new(product_params) if @post.save flash[:success] = '投稿されました' redirect_to user_path(@user) else flash[:danger] = '投稿されません' end end end
試したこと
form_forのリファレンスを読んだり、検索を色々してみましたが、どのような実装が良いのか分かりませんでした。ご覧の通り、prodcts_controller、posts_controllerどちらにもcreateメソッドがありまして、どちらで処理をするのが適切か悩んでいます。(おそらくposts_controllerの方がいいですよね)
補足情報(FW/ツールのバージョンなど)
Rails5.2.1
語句がちゃんと使えていなければご指摘お願いします。
必要なソースコードがあれば追記します。
ヒントなどいただければと思います、よろしくお願いします
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。