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

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

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

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

Ruby on Rails

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

1766閲覧

rails groupに所属していないuserはmessage画面へ遷移できなくする方法

ko_no

総合スコア16

Ruby

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

Ruby on Rails

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/06/23 03:37

編集2020/06/23 07:13

前提・実現したいこと

当方チャットアプリのグループ機能を実装中です。
画面の左にグループ一覧を表示させており、グループ名をクリックすると
1、ユーザーが所属しているグループだったらメッセージ一覧画面へ遷移
2、ユーザーがまだ所属していないグループだったらエラーのフラッシュメッセージを表示
の分岐を作りたいと考えております
この際、ifの条件分岐でcurrent_userがクリックしたグループのidを所持していれば、1へ、それ以外(else)は2へ、という形で考えているのですが、current_userがクリックしたグループのidを所持しているかの確認方法が思いつきません
何かスマートなやり方はないでしょうか、ご教授いただけたら幸いですm(_ _)m
イメージ説明

テーブルやルーター

userテーブル
groupテーブル
messageテーブル
group_usersテーブル(中間テーブルでuser_idとgroup_idが入っています)
以上4テーブル

messageはgroupにネストされております↓

resources :groups do resources :messages end

該当のソースコード

routes↓

Rails.application.routes.draw do devise_for :users, :controllers => { :registrations => 'users/registrations', :sessions => 'users/sessions' } devise_scope :user do get "sign_in", :to => "users/sessions#new" get "sign_out", :to => "users/sessions#destroy" end root 'groups#index' resources :groups do member do get :join end resources :messages end end

_group.index.html.erb↓

<div class="Main__left"> <div class="Main__left__search"> <div class="Main__left__search-squeeze"> <form action="#" class="Main__left__search-squeeze-box"> <input type="checkbox"> </form> <p>参加中のグループに絞る</p> </div> <form action="#" class="Main__left__search-main"> <input type="text" placeholder="グループを検索" class="Main__left__search-main-text"> <input type="submit" value="検索" class="Main__left__search-main-btn"> </form> </div> <% groups.each do |group| %> <div class="Main__left__group"> <%= link_to(group_messages_path(group), class: 'Main__left__group-a') do %> <div class="Main__left__group-name"> <%= group.group_name %> </div> <div class="Main__left__group-text">最新テキスト</div> <div class="Main__left__group-time">最新更新日時2020/06/20</div> <%= link_to "参加する", join_group_path(group), class: 'Main__left__group-btn' %> <% end %> </div> <% end %> </div>

group.rb↓

class Group < ApplicationRecord has_many :group_users has_many :users, through: :group_users has_many :messages end

message.rb↓

class Message < ApplicationRecord belongs_to :user belongs_to :group end

user.rb↓

class User < ApplicationRecord has_many :group_users has_many :messages has_many :groups, through: :group_users end

group_user.rb↓

class GroupUser < ApplicationRecord belongs_to :group belongs_to :user end

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

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

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

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

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

winterboum

2020/06/23 06:59 編集

userテーブル groupテーブル messageテーブル の関連定義の所を載せてください。 だいたい見当は付きますが、そのとおりになっているかどうか確認が必要なので
ko_no

2020/06/23 07:13

各モデルのリレーションを追記させていただきました!
guest

回答1

0

ベストアンサー

色々あります

  1. current_user.groups とすると属しているグループが得られるので、該当するgroupがあるか調べる
  2. current_user.group_usersとして得られたgroup_user に「グループのid」のものが有るか調べる
  3. GroupUser.find_by(group_id: グループのid,user_id: current_user.id)としてデータがあるか調べる

追記

def transition_limit correct_user = current_user.group_users.select('group_id') # (1) selected_group = Group.find(params[:group_id]) selected_group_id = selected_group.id # binding.pry unless correct_user.include?(selected_group_id) redirect_to root_path, notice: '「参加する」ボタンを押し、グループに参加してください' end end

(1) はいけません。current_userを壊してますし、得られるのが group_user なので命名が悪い
group_id が「属しているかどうか調べるgroupのid」ですね?
ですと
unless current_user.group_users.select{|gu| gu.group_id == group_id).present?
ですね。
この方がスマートかな
unless current_user.group_users.find_by(group_id: group_id)

投稿2020/06/23 14:05

編集2020/06/24 06:08
winterboum

総合スコア23347

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

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

ko_no

2020/06/24 03:30 編集

ご回答ありがとうございます! いただいた回答のやり方でクリックされたgroup_idを取り出すことができました!! ただ一点自分の知識不足で不明点があるのでご教授いただいてもよろしいでしょうか、、?? 2番のやり方でcurrent_userのgroup_idは取り出せたのですが、最後のクリックされたgroup_idと比較するところでつまづいてしまっています、、、 ``` def transition_limit correct_user = current_user.group_users.select('group_id') selected_group = Group.find(params[:group_id]) selected_group_id = selected_group.id # binding.pry unless correct_user.include?(selected_group_id) redirect_to root_path, notice: '「参加する」ボタンを押し、グループに 参加してください' end end ``` このような形でやっているのですが最後のunless式が上手く決まりません 上手くこの二つのgroup_idを比較できる方法はないでしょうか??
ko_no

2020/06/24 08:17

お忙しい中回答本当にありがとうございます!!m(_ _)m 助言いただき以下のように変更したおかげで問題なく実装できました!しかもスマートに!! 本当にありがとうございました!! def transition_limit clicked_group_id = Group.find(params[:group_id]).id unless current_user.group_users.find_by(group_id: clicked_group_id) redirect_to root_path, notice: '「参加する」ボタンを押し、グループに参加してください' end end
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問