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

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

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

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

Ruby

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

Q&A

解決済

1回答

3736閲覧

Rails 紐つけたモデルを別のControllerを使って表示する

0000Y

総合スコア12

Ruby on Rails 5

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

Ruby

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

0グッド

0クリップ

投稿2019/07/08 10:11

編集2019/07/09 07:17

前提・実現したいこと

勉強の為RubyOnRailsでブログサイトを作っています。

Modleの構造とViewでの表示で悩んでいます。
現在のModleの構造と致しましては
・Userモデル(UserProfileモデルと1:1で紐付けています。deviseを使い登録機能を実装しています。)
・UserProfileモデル(Postモデルと1:nで紐付いています。登録したユーザのプロフィールを扱っています。)
・Postモデル(登録したユーザの投稿機能です。)
現状はこの様に
・Userモデルに対してUserProfileモデルを1:1, UserProfileモデルにPostモデルを1:nの関係性にしています。

そして、エンドユーザに表示する為にShowUsersControllerを作りそこのindexに各紐ついたユーザ情報を表示していきたいです。

発生している問題・エラーメッセージ

・Modelの構造として
今回の場合ただ段階的にUser→UserProfile→Postと紐付けるのではなく
UserモデルにUserProfileモデルを1:1そして更にUserモデルにPostモデルを1:nした方が
作っていく上で綺麗な形になるのでしょうか?

・Viewでの表示について
ShowUsersControllerのindexで各紐付いているユーザ情報を表示する際
ShowUserController側でどの様な処理を書けばよろしいでしょうか?
Showの詳細部分などは画面遷移された際にパラメータからidを受け取ってそこから紐付いているモデルを表示させる処理はわかるのですがindexの方に関して変に詰まってしまいます。
includesを使ってmodel同士をまとめて取得しViewの方でeachで回して表示していけばよろしいのでしょうか?

とても長文になってしまい申し訳御座いません。
読んでいただきありがとう御座います。

ご教授頂けたらと幸いです。
何卒よろしくお願い致します。

該当のソースコード

Ruby

1class ShowusersController < ApplicationController 2 3 def index 4 @user = current_user 5 6 end 7 8 def show 9 # パラメータからcurrent_userのidを取得,処理を書く 10 11 # 取り出したユーザidと紐付いているUserProfileを取り出して 12 @user_profile = UserProfile.where(user_id: @user.id) 13 # 更に取り出したUserProfileに紐付いているPostを取り出す 14 @post = Post.where(user_profile_id: @user_profile.ids) 15 end 16end

Ruby

1class User < ApplicationRecord 2 # Include default devise modules. Others available are: 3 # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable 4 devise :database_authenticatable, :registerable, 5 :recoverable, :rememberable, :validatable 6 7 # user_profleモデルと1:1の紐付け 8 has_one :user_profile, dependent: :destroy 9end 10

Ruby

1class UserProfile < ApplicationRecord 2 # userモデルと1:1の紐付け 3 belongs_to :user 4 # postモデルと1:nの紐付け 5 has_many :posts, dependent: :destroy 6 # carrierwave 7 mount_uploader :image, ImageUploader 8end 9

Ruby

1class Post < ApplicationRecord 2 # userprofileと1:nの紐付け 3 belongs_to :user_profile 4end 5

Ruby

1showusers/index 2<h1>エンドユーザトップページ</h1> 3<%= @user.name %> 4<% @post.each do |post| %> 5<div class="card card-body bg-light"> 6 <div class="title"> 7 <%= link_to user_profile_path(post.id) do %> 8 <%= post.title %> 9 <% end %> 10 </div> 11 <div class="active_area"> 12 活動地域: <%= post.user_profile.active_area %> 13 </div> 14 <div class="language"> 15 言語: 16 </div> 17 <div class="experience"> 18 経験年数: 19 </div> 20 <div class="text"> 21 <%= post.text %> 22 </div> 23</div> 24<% end %> 25<p>--------------<br></p>

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

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

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

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

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

winterboum

2019/07/08 10:24

どう表示したいか、がわからないと contrllerで何をしたらよいか、判らんです
0000Y

2019/07/08 10:44

ご回答頂きありがとう御座います。 ご指摘ありがとう御座います。 ShowUsersControllerのindexで Userモデル、UserProsileモデル、Postモデルの紐ついた値を Viewの方で回して投稿された数だけ表示したいです。 例と致しまして 登録したユーザAのユーザ情報とプロフィール内容を投稿した際にShowUsersControllerのindexに表示させたいです。
winterboum

2019/07/08 12:49

それだけでは助言しようがないです。 user.rb profile.rb post.rbの内容と viewも具体的なcodeを見せて下さい。
0000Y

2019/07/08 22:07

ご指摘修正出来ず申し訳御座いません。 なんどもありがとう御座います。 codeを載せさせて頂きます。 class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable # user_profleモデルと1:1の紐付け has_one :user_profile, dependent: :destroy end ################## class UserProfile < ApplicationRecord # userモデルと1:1の紐付け belongs_to :user # postモデルと1:nの紐付け has_many :posts, dependent: :destroy # carrierwave mount_uploader :image, ImageUploader end ################ class Post < ApplicationRecord # userと1:nの紐付け belongs_to :user_profile end ############## Views showusers/index <h1>エンドユーザトップページ</h1> <%= @user.name %> <% @post.each do |post| %> <div class="card card-body bg-light"> <div class="title"> <%= link_to user_profile_path(post.id) do %> <%= post.title %> <% end %> </div> <div class="active_area"> 活動地域: <%= post.user_profile.active_area %> </div> <div class="language"> 言語: </div> <div class="experience"> 経験年数: </div> <div class="text"> <%= post.text %> </div> </div> <% end %> <p>--------------<br></p>
guest

回答1

0

ベストアンサー

codeは「該当のソースコード」の方に移して置いて下さい。

拝見した所、このviewは index というよりは users/show(もしくは profile/show) の様に思えます。どちらか、はmodelの関連から決めて下さい
indexって目次ですから、このような一件の詳細ですと違和感があります。

以下 users/show にしたつもりで書きます。
必要なのは @user とそれに関連する profile と posts です。
@user は User.find(prams[:id]) でとればよいです。
残りの2つは、controllerで用意する場合と省略する場合とがあります。
用意するなら
@user_profile = @user.user_profile
@posts = @user.user_profile.posts

でもこのくらいならcontrollerで用意しなくてもviewで
<% @post.each do |post| %> を
<% @user.user_profile.posts.each do |post| %>
にすれば済む話です。

これで質問に答えてるかな、、、

投稿2019/07/09 06:55

winterboum

総合スコア23284

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

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

0000Y

2019/07/09 07:15

初心者の初めての投稿に関わらず 質問の仕方から根気強くご指摘ご返事頂きありがとう御座います。 ご丁寧な説明本当にありがとう御座います。 controllerとviewでのテクニック勉強になります。 これからの実装でも為になります。 おしゃって頂いた通りに今回はviewの方で関連付けを表示して行きたいと思います。 ご丁寧にありがとう御座いました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問