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

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

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

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

Ruby

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

Ruby on Rails

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

Q&A

1回答

296閲覧

[Rails5]商品モデルを別ページへ追加して、表示する処理をしたい。

kioak

総合スコア20

Ruby on Rails 5

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

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2018/11/15 03:00

前提・実現したいこと

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

語句がちゃんと使えていなければご指摘お願いします。
必要なソースコードがあれば追記します。

ヒントなどいただければと思います、よろしくお願いします

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

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

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

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

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

guest

回答1

0

以下のようなクラス図になっているのであれば、userのリレーションを辿ってproductのデータを取得できると思います。

クラス図

<% @user.posts.each |post| %> <%= post.content %> <%= post.product.title %> <% end %>

投稿の保存はposts_controllerでいいと思います。
投稿を保存する時にproduct_idを渡すには_product_list.html.erbでhidden_fieldを使ってproductのidを渡すのがいいかもしれません。

<% 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.hidden_field :product_id, product.id %> <%= f.submit "追加", class: "btn btn-primary" %> <% end %> </div> </div> <% end %> <% end %>

投稿2018/11/15 09:12

KiyoKuro

総合スコア51

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問