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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

822閲覧

【if文の条件分岐】投稿とユーザーの所属グループはマッチするか?

tomtom1

総合スコア168

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/07/09 08:59

編集2020/07/10 09:37

###知りたいこと
グループに共有した投稿を、グループ内メンバーは閲覧できるif文の条件分岐。

全ての投稿は自分以外閲覧不可です。
しかし、グループ内に投稿が共有された場合、グループ内メンバーは閲覧できるようにしたいです。

post/show

view

1<div class="container"> 2 <% if @user.id == @current_user.id %> 3 <p>あなたは閲覧出来ます!</p> 4 <% else %> 5 <p>あなたは閲覧出来ません</p> 6</div>

###コード

Model

1class Group < ApplicationRecord 2 has_many :group_users, dependent: :delete_all 3 has_many :group_posts, dependent: :delete_all 4 has_many :users, through: :group_users 5 has_many :posts, through: :group_posts

Model

1class GroupUser < ApplicationRecord 2 belongs_to :group 3 belongs_to :user 4end

Model

1class GroupPost < ApplicationRecord 2 belongs_to :group 3 belongs_to :post 4end

Controller

1class PostsController < ApplicationController 2 def show 3 @post = Post.find_by(id: params[:id]) 4 @user = @post.user 5 end 6end

###考えている事
group_postsで、投稿がどこかのグループに所属しているか?そのgroup_idは?
group_usersで、閲覧ユーザーはどこかグループに所属しているか?そのgroup_idは?
そして、if文で、上記2つがマッチしているか?という条件分岐?

あるいは、include?などを使う方法もあるのかな?とも考えています。

現在、答えにたどり着けずにいます。
お分かりの方、ぜひ宜しくお願いします。

###追記
現在のエラーです。
イメージ説明
group_post_ids に変更した場合エラーは無くなりますが、if分の条件に該当せず閲覧出来ません。
イメージ説明
###追記2

schema

1 create_table "group_posts", force: :cascade do |t| 2 t.integer "group_id" 3 t.integer "post_id" 4 t.datetime "created_at", null: false 5 t.datetime "updated_at", null: false 6 t.index ["group_id"], name: "index_group_posts_on_group_id" 7 t.index ["post_id"], name: "index_group_posts_on_post_id" 8 end 9 10 create_table "group_users", force: :cascade do |t| 11 t.integer "group_id" 12 t.integer "user_id" 13 t.datetime "created_at", null: false 14 t.datetime "updated_at", null: false 15 t.index ["group_id"], name: "index_group_users_on_group_id" 16 t.index ["user_id"], name: "index_group_users_on_user_id" 17 end 18 19 create_table "groups", force: :cascade do |t| 20 t.string "name" 21 t.text "content" 22 t.datetime "created_at", null: false 23 t.datetime "updated_at", null: false 24 end 25create_table "posts", force: :cascade do |t| 26 t.text "content" 27 t.datetime "created_at", null: false 28 t.datetime "updated_at", null: false 29 t.integer "user_id" 30 t.string "image_name" 31 t.string "title" 32 end

Model

1class User < ApplicationRecord 2 has_many :posts, dependent: :delete_all 3 has_many :group_users 4 has_many :groups, through: :group_users

Model

1class Post < ApplicationRecord 2 belongs_to :user 3 has_many :group_posts, dependent: :delete_all

###追記3
現在のエラー
イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

こういうとき私は model Postに
def readable?(user) user.group_users.map(&:group_id).include? group_id end
ってのを作って <% if @post.readable?(current_user) %>ってします。

user.group_users.map(&:group_id).include? group_idんところは
user.groups.include? group でも良いしそのほうが読みやすいのですが、
post.group_id から group読み込むのでDBアクセスが一回増えるかなぁ、、、
という
もしかしたら無用な抵抗。

追記
user_id == user.id || (group_posts.map(&:group_id) & user.group_users.map(&:group_id)).present?
かな

def readable?(user) user_id == user.id || (group_posts.map(&:group_id) & user.group_users.map(&:group_id)).present? end
ってのを作って <% if @post.readable?(current_user) %>ってします。

投稿2020/07/09 12:11

編集2020/07/10 10:43
winterboum

総合スコア23329

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

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

tomtom1

2020/07/10 05:48

ありがとうございます!自分では確実にたどり着けない答えでした。勉強になります。 エラーが発生してしまいました。追記しましたので、ご確認頂ければ幸いです。
winterboum

2020/07/10 07:23

group_idとしたのは多分そんなところだろということで当てずっぽうに使ったので、modelに定義されているcolumn名を使って正しい名前にしてください
tomtom1

2020/07/10 07:37

ありがとうございます!おそらく合っていて、modelで定期しているcolumnは、group?_idです..。 schemaを追記致しましたので、ご確認頂ければ幸いです!
winterboum

2020/07/10 07:38

それとmodelの関連定義のところと
winterboum

2020/07/10 07:39

schemaにpostがないよ
tomtom1

2020/07/10 07:47

schemaにpost追加しました!あと、Modelは、すでに記載のgroup関連定義以外に、PostとUserの関連定義追加しました!他に足りないところありましたらお教えください。
winterboum

2020/07/10 08:31

userは復数のgroupに属する postは復数のgroupに見せる と言うことですね?
tomtom1

2020/07/10 08:53

はい!そうです!
tomtom1

2020/07/10 09:38

トライしてみましたが、エラーが出てしまいました!追記3に表示します。
tomtom1

2020/07/11 09:48

ありがとうございます!解決しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問