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

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

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

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

Q&A

解決済

1回答

2349閲覧

【rails 初心者】 投稿内容をマイページで表示させたい

dodododon

総合スコア1

Ruby on Rails

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

0グッド

0クリップ

投稿2020/11/15 05:45

編集2020/11/16 08:29

前提・実現したいこと

Railsでuserが商品(ネイル)を投稿するシステムを作っています。
userが商品を投稿し、userのマイページで、current_userだけが投稿した内容を表示させたいのですが
全く反映がされません。
(nailのindex画面では全情報を反映させるようにしており、そこは問題なく表示ができています)

表示させたいマイページ

show

1<div class="container"> 2 <h2>マイページ</h2> 3 <% @nails.each do |nail| %> 4 <%= nail.name %> 5 <%= attachment_image_tag nail,:image, :fill, 50, 50 ,format: "jpeg" %> 6 <%= nail.price %> 7 <%= nail.introduction %> 8 <% end %> 9 10 <%= link_to "新規投稿", new_nail_path %> 11</div> 12_____

userのコントローラー


controller

1class Users::UserController < ApplicationController 2 3 def show 4 @user = current_user 5 @nails = Nail.where(user_id: @user.id) 6 end 7 8 def edit 9 @nail = Nail.find(paramas[:id]) 10 end 11 12 private 13 def nail_params 14 params.require(:nail).permit(:name, :image, :brand, :introduction, :price, :user_id) 15 end 16 17 def user_params 18 params.require(:user).permit(:last_name, :first_name,:last_name_kana, :first_name_kana, :address, :telephone_number, :email) 19 end 20end

###ルーティング

route

1 2Rails.application.routes.draw do 3 devise_for :users, controllers: { 4 registrations: 'users/registrations', 5 sessions: "users/sessions", 6 } 7 8namespace :users do 9 resources :user,only: [:show, :edit] 10 resources :relationships 11 end 12 13 resources :nails do 14 resource :favorites, only:[:create, :destroy] 15 resources :nail_comments,only:[:index,:show,:edit,:new,:destroy,:create] 16 end 17 18 root 'home#top' 19 # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html 20end 21

###ネイルの新規投稿画面

<div class="container"> <%= form_with model: @nail, url: nails_path, method: :post, local: true do |f| %> <%= f.hidden_field :nail_id %> <table> <tr> <th><%= f.label :user, '名前' %></th> <th><%= f.label :name, '商品名' %></th> <th><%= f.label :price, '価格' %></th> <th><%= f.label :image,'商品画像' %></th> <th><%= f.label :introduction, '商品説明' %></th> </tr> <tr> <td><%= f.text_field :user %></td> <td><%= f.text_field :name %></td> <td><%= f.text_field :price %>円</td> <td><%= f.attachment_field :image %></td> <td><%= f.text_area :introduction %></td> </tr> <tr> <td><%= f.submit '登録' %></td> </tr> </table> <% end %> </div>

###ネイルのコントローラー

class NailsController < ApplicationController before_action :authenticate_user! before_action :set_nail, only: [:show, :edit, :update, :destroy] def new @nail = Nail.new end def create @nail = Nail.new(nail_params) @nail.save! redirect_to nails_path end def index @nails = Nail.all end private def nail_params params.require(:nail).permit(:relationship_id, :name, :image, :brand, :introduction, :price, :user_id) end def set_nail @nail = Nail.find(params[:id]) end end

model

1class Nail < ApplicationRecord 2 attachment :image 3 belongs_to :user, optional: true 4 has_many :favorites 5 has_many :nail_comments 6end 7_________________________________ 8class User < ApplicationRecord 9 # Include default devise modules. Others available are: 10 # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable 11 devise :database_authenticatable, :registerable, 12 :recoverable, :rememberable, :validatable 13 14 has_many :nails 15 has_many :nail_comments 16end

試したこと

userコントローラーの記載方法を何度か変更してみましたが、結果は変わらず。

@user = current_user @nails = Nail.where(user_id: @user.id) →@nails = @user.nails.all

ここに問題に対して試したことを記載してください。
##binding.pryで調べてみました

3: def show 4: @user = current_user 5: @nails = Nail.where(user_id: @user.id) 6: binding.pry => 7: end [1] pry(#<Users::UserController>)> @nails Nail Load (2.1ms) SELECT "nails".* FROM "nails" WHERE "nails"."user_id" = ? [["user_id", 3]] ↳ app/controllers/users/user_controller.rb:7 => [#<Nail:0x00000000054be060 id: 17, created_at: Sat, 14 Nov 2020 03:43:42 UTC +00:00, updated_at: Sat, 14 Nov 2020 03:43:42 UTC +00:00, relationship_id: nil, user_id: 3, name: nil, image_id: nil, brand: nil, introduction: nil, price: nil>]

ちなみにshow画面で
@nails = Nail.allにしてみると全ての投稿内容は反映できています。

補足情報(FW/ツールのバージョンなど)

Rails 5.2.4.3

初学者かつ、初めての質問となりますので、何か不足等ありましたらご指摘ください。
よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

マイページ自体は表示されるのでしょうか? (h2 マイページ、および新規投稿ボタン)
@nails.each do |nail| の直前にbinding.pryを挿入して@nailsの中身を確認するとどうなりますか?

erb

1<% binding.pry %> 2<% @nails.each do |nail| %>

投稿2020/11/16 23:31

neko_daisuki

総合スコア2090

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

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

dodododon

2020/11/17 01:13 編集

ご返信ありがとうございます。 マイページ自体は表示ができています。(新規投稿ボタンも問題なく表示・機能しています) ご指示いただいた内容ですが、下記のような結果となりました。 idとuser_idは渡っているようなのですが何故かその他の値は渡っていないようです… ```erb 1: 2: <div class="container"> 3: <h2>マイページ</h2> 4: <% binding.pry %> => 5: <% @nails.each do |nail| %> 6: <%= nail.name %> 7: <%= attachment_image_tag nail,:image, :fill, 50, 50 ,format: "jpeg" %> 8: <%= nail.price %> 9: <%= nail.introduction %> 10: <% end %> [1] pry(#<#<Class:0x000000000744fe10>>)> @nails Nail Load (2.7ms) SELECT "nails".* FROM "nails" WHERE "nails"."user_id" = ? [["user_id", 3]] ↳ app/views/users/user/show.html.erb:5 => [#<Nail:0x000000000703e6c8 id: 17, created_at: Sat, 14 Nov 2020 03:43:42 UTC +00:00, updated_at: Sat, 14 Nov 2020 03:43:42 UTC +00:00, relationship_id: nil, user_id: 3, name: nil, image_id: nil, brand: nil, introduction: nil, price: nil>] ```
neko_daisuki

2020/11/17 02:31

その他の値が保存されていないということはありませんか。 rails c して Nail.find_by(user_id: 3).update(name: "NAME") してからユーザーページにアクセスするとNAMEが表示されませんか?
dodododon

2020/11/17 03:52

その他の値については保存が出来ていると思っています。(下記のnail/index.html.erb上では全ての情報が表示出来ております…) ``` <h1>ネイル一覧</h1> <% @nails.each do |nail| %> <div class="nail"> <%= link_to nail_path(nail.id) do %> <%= attachment_image_tag nail,:image, :fill, 50, 50 ,format: "jpeg" %> <%= nail.name %> <% end %> <%= nail.introduction %> <%= nail.price %> </div>  <% end %> ``` また、ご指示いただいた方法を試してみたのですがマイページでの表示は変化が見られませんでした。 ``` [vagrant@localhost homenail]$ rails c Running via Spring preloader in process 9288 Loading development environment (Rails 5.2.4.3) irb(main):001:0> Nail.find_by(user_id: 3).update(name: "NAME") Nail Load (1.0ms) SELECT "nails".* FROM "nails" WHERE "nails"."user_id" = ? LIMIT ? [["user_id", 3], ["LIMIT", 1]] (0.1ms) begin transaction Nail Update (3.2ms) UPDATE "nails" SET "name" = ?, "updated_at" = ? WHERE "nails"."id" = ? [["name", "NAME"], ["updated_at", "2020-11-17 03:40:23.564229"], ["id", 17]] (2.8ms) commit transaction => true ``` これはuserの名前をNAMEに変更して表示がされるかの確認をされているのでしょうか? 何度も申し訳ありません…。
neko_daisuki

2020/11/17 04:17

Nailのnameがnilとなっていたので、NAMEという値に変更しました。 これでUserのIDが3のユーザーでマイページを開けばNailのNAMEが表示されると思ったのですが変ですね。 マイページで表示されるはずの@nailsにidが17のNailが含まれているか確認してみて下さい。 (binding.pry するか、users/show.html.erb に<%= nail.id %> を追加) また、 Nail.find(17).name で先程更新したはずのNAMEが返ってくるかも知りたいです。
dodododon

2020/11/17 04:56

大変申し訳ありません!! 再度読み込みをしてみた所、マイページでNAMEの表示が出ました。 またbinding.pryにて確認した所、idに17が入っておりました。 ___________________________________________________ 3: <h2>マイページ</h2> 4: <% binding.pry %> => 5: <% @nails.each do |nail| %> 6: <%= nail.name %> 7: <%= attachment_image_tag nail,:image, :fill, 50, 50 ,format: "jpeg" %> 8: <%= nail.price %> 9: <%= nail.introduction %> 10: <% end %> [1] pry(#<#<Class:0x0000000006083198>>)> @nails Nail Load (1.6ms) SELECT "nails".* FROM "nails" WHERE "nails"."user_id" = ? [["user_id", 3]] ↳ app/views/users/user/show.html.erb:5 => [#<Nail:0x00007f0e35a54cf0 id: 17, created_at: Sat, 14 Nov 2020 03:43:42 UTC +00:00, updated_at: Tue, 17 Nov 2020 03:40:23 UTC +00:00, relationship_id: nil, user_id: 3, name: "NAME", image_id: nil, brand: nil, introduction: nil, price: nil>] ___________________________________________ rails cにて確認をしてみました所、”NAME”も返ってきました! __________________________________ irb(main):001:0> Nail.find(17).name Nail Load (0.7ms) SELECT "nails".* FROM "nails" WHERE "nails"."id" = ? LIMIT ? [["id", 17], ["LIMIT", 1]] => "NAME" ___________________________________ 何度も申し訳ありません。 よろしくお願い致します。
neko_daisuki

2020/11/17 05:12

表示しようとした値がすべて空だったため、非表示に見えてしまっていたようですね。 この空のNail(id=17)はどうやって作成されたのでしょうか。 値を正常に保存できれば無事に表示できそうですね。
dodododon

2020/11/17 05:30

本当に何度も申し訳ありません…。 ありがとうございます。 Nailは下記のnail/new.html.erbで作成しました。 Nailコントローラーは上記の質問内に記載致しました。(文字量が増えると思いますのでこちらでは割愛させていただきました) _________________________________________________ <%= form_with model: @nail, url: nails_path, method: :post, local: true do |f| %> <%= f.hidden_field :nail_id %> <table> <tr> <th><%= f.label :user, '名前' %></th> <th><%= f.label :name, '商品名' %></th> <th><%= f.label :price, '価格' %></th> <th><%= f.label :image,'商品画像' %></th> <th><%= f.label :introduction, '商品説明' %></th> </tr> <tr> <td><%= f.text_field :user %></td> <td><%= f.text_field :name %></td> <td><%= f.text_field :price %></td> <td><%= f.attachment_field :image %></td> <td><%= f.text_area :introduction %></td> </tr> <tr><td><%= f.submit '登録' %></td></tr> </table> <% end %> _______________________________________________________________ ご確認お願い致します…!
neko_daisuki

2020/11/17 06:07

フォームヘルパーほとんど使ったことがないので心許ないのですが、 nail_paramsのuser_idがどこからくるのか分かりません。 nails#createで作成したNailを(たぶん正常に保存される) 何か別の手段でUserと紐付けたと思うのですが。
dodododon

2020/11/17 06:12

ご返信ありがとうございます。 db上ではnailテーブルにuser_idのカラムを持たせています。 schemaでは下記のようになっています。 ____________________________ create_table "nails", force: :cascade do |t| t.datetime "created_at", null: false t.datetime "updated_at", null: false t.integer "relationship_id" t.integer "user_id" t.string "name" t.string "image_id" t.string "brand" t.text "introduction" t.integer "price" end ____________________________ 紐付け方に間違いがあったでしょうか… 本当に度々申し訳ありません。
neko_daisuki

2020/11/17 06:24

問題はないんですが、どうやって紐付けたのかが分かりません。 Nail.new(nail_params)のときに、nail_paramsにuser_idが含まれていれば紐付けられるはずですが、 user_idがnail/new.html.erbに見当たらないので、どうやって紐付けれたのか不思議です。 それから、@nails = Nail.all した時は表示されるということは、 紐付けは別にして、Nailは正常に作成されるということですよね。
dodododon

2020/11/17 06:41

nailsコントローラーで下記のように定義しているのですが、nail/new.html.erb上でuser_idを受け取る表記が無いと言う事でしょうか?理解が浅くて申し訳ありません。 ________________________________ private def nail_params params.require(:nail).permit(:relationship_id, :name, :image, :brand, :introduction, :price, :user_id) end ________________________________ 仰る通りです… @nails = Nail.all とすると過去に作成したデータは全て表示が出来ているようです。
neko_daisuki

2020/11/17 06:59

nail/new.html.erb から nails#create に user_id が送信されていないように見えます。 nail/new.html.erbに <%= f.text_field :user %> というのがありますが、 もしかすると、railsにはこの記述でuser_idが追加される素敵機能があるのでしょうか。 def create の中で  binding.pry として、paramsがどうなっているかご確認ください。 nail_paramsはストロングパラメータというやつで、モデルの作成・更新にどのパラメーターを受け入れるかの定義です。 .permit(:user_id)とすれば、user_idを受け入れますが、そもそもuser_idが送られていないように見えるので今は関係ないかも。
dodododon

2020/11/17 07:33

本当に長くお付き合いいただきありがとうございます。 仰る通りbinding.pryで調べた所、user_idはnilになってしまっておりました。 ______________________________________ 9: def create 10: @nail = Nail.new(nail_params) 11: @nail.save! 12: binding.pry => 13: redirect_to nails_path 14: end [1] pry(#<NailsController>)> @nail => #<Nail:0x00007f2cd80e9578 id: 32, created_at: Tue, 17 Nov 2020 07:30:31 UTC +00:00, updated_at: Tue, 17 Nov 2020 07:30:31 UTC +00:00, relationship_id: nil, user_id: nil, name: "キャンメイク ピンク", image_id: "32e214332985376b100360196e91a756f4d6b1ae3d5b4ff09f67b80fe966", brand: nil, introduction: "ok", price: 300> ____________________________________ どうやって作成出来ているのか自分でもわからなくなってしまいました…。
neko_daisuki

2020/11/17 07:47

どうやってNail(id=17)とUser(id=3)が紐付けられたのかは謎ですが、 nail_paramsを下記に書き換えると紐づけられるようになると思います。 # ログインしていないユーザーによるNailの作成を許可する (Nail belongs_to :user, optional: true) params.permit(:nail).permit(...).merge(user_id: current_user.try(:id)) 許可しない場合はモデルのoptional: falseにすれば、saveに失敗するはずです。 ちなみに、nails/new.html.erb のフォームに current_user.id を埋めこんで送信するのはやめましょう。 送信される値は攻撃者が任意の値に書き換えられます。
dodododon

2020/11/17 08:14

ありがとうございます!!! 早速試してみた所、マイページで表示されるようになりました…。 本当に長い間、お付き合いいただいてありがとうございます。 mergeを使うことでハッシュを連結するようなイメージでしょうか? モデルの件、nails/new.html.erb のフォームに current_user.idを埋め込まない事についてもお教えいただき、またお忙しい中、貴重なお時間割いてくださって本当にありがとうございました。
neko_daisuki

2020/11/17 08:33

mergeはふたつのハッシュを統合します { name: 1 }.merge({ user: 2 }) => {:name=>1, :user=>2} current_user.idはsession経由のはずなので、改変されず安心です。 解決できて良かったです。
dodododon

2020/11/17 10:34

詳細までご説明いただいてありがとうございます…! 非常に勉強になりました。 今後自身でも使えるようになります! また機会ありましたらその際はよろしくお願い致します!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問