5 : チャットルームの作成③

前の章 : チャットルームの作成②

Coffeecup header5 この章は、前章の「チャットルームの作成②」の続きになります。
前章の内容がまだ終わっていない方は、こちらからお願いします。

 ② : 「entries」データの作成・表示


 では、「entries」データベースの作成・表示の設定をしてみましょう!
ここでは、
  • 「users」の「show」ページでの「entries」データの作成(create)
  • Chrome messages users 1 start chatチャットを始める をクリックすると、

    entries
    id room_id user_id created_at updated_at
    1 1 1 2016-04-12 20:30:21 2016-04-12 20:30:21
    id room_id user_id created_at updated_at
    1 1 2 2016-04-12 20:30:21 2016-04-12 20:30:21
     どの会員がどのチャットルームに参加しているかのデータを作成される。

  • 「rooms」の「show」ページでの「entries」データの表示

  •  チャットルームに参加している会員の表示 Chrome messages rooms 1 no messages
     ログインしている会員の参加しているチャットルームの表示 Chrome messages users 1 link chats 1 Chrome messages rooms

  • チャットルームを閲覧できるユーザーの制限

  • チャットルームに参加している会員でなければ、チャットルームを見れないようにします。

     ログインしている会員がチャットルームに参加しているかどうかは、

    entries
    id room_id user_id created_at updated_at
    1 1 1 2016-04-12 20:30:21 2016-04-12 20:30:21
    「entries」データを使って判定します。

の3つをしてみます。

まずはentries」データの作成(createからやってみましょう!

 ⑴ : 「entries」データの作成(create)


 まず「entries」データの作成をやってみましょう!
「entries」データの作成には、

1 Entry.create(:user_id => 数字, :room_id => 数字)

を、データ操作のファイル(controllerファイルに追加することで設定します。

今回の「entries」データは、 Chrome messages users 1 start chatチャットを始める をクリックして、rooms」データを作成する時に一緒に作成します。

なので、

1 Entry.create(:user_id => 数字, :room_id => 数字)

「rooms_controller.rb」の中に設定を追加します。
 まずは、現在ログインしている会員がチャットルームに参加していることを示すデータを作成しましょう!

app > controllers > rooms_controller.rbの内容を下のように変更しましょう!
※ 内容はこちらを参考にして下さい

 rooms_controller.rb(7行目を追加)
※ 半角英数字で入力。変更が完了したら「Command」と「s」を一緒に押して内容を保存して下さい。
 Windowsをご利用の方は、「ctrl」と「s」を一緒に押して内容を保存して下さい。


5 6 7 8 9 10 def create @room = Room.create @entry1 = Entry.create(:room_id => @room.id, :user_id => current_user.id) redirect_to "/rooms/#{@room.id}" flash[:notice] = "チャットを作成しました!" end

ここで、
  • 「room_id」に「@room」の「id」
  • 「user_id」に「current_user」の「id」
が入った「entries」データが作成されます。

 もし、ログインいる会員の「id」が「1」・作成したチャットルームの「id」が「1」のデータなら、

entries
id room_id user_id created_at updated_at
1 1 1 2016-04-12 20:30:21 2016-04-12 20:30:21

のデータがここで作成されます。
 次に、チャットする相手がチャットルームに参加していることを示すデータを作成しましょう!

entries
id room_id user_id created_at updated_at
2 1 2 2016-04-12 20:30:21 2016-04-12 20:30:21

ここでは
  • rooms」データを作成するボタン チャットを始める を作っている

  •  show.html.erb(「app > views > users」フォルダ)
    10 11 12 13 14 15 16 17 <% else %> <%= form_for @room do |f| %> <%= fields_for @entry do |e| %> <%= e.hidden_field :user_id, :value => @user.id %> <% end %> <%= f.submit "チャットを始める", :class => "btn btn-warning" %> <% end %> <% end %>

    に、新しい「entries」データ作成する設定を追加し、

  • チャットを始める をクリックすると「rooms_controller.rb」で

  •  rooms_controller.rb
    5 6 7 8 9 10 11 def create @room = Room.create @entry1 = Entry.create(:room_id => @room.id, :user_id => current_user.id) @entry2 = Entry.create(params.require(:entry).permit(:user_id, :room_id).merge(:room_id => @room.id)) redirect_to "/rooms/#{@room.id}" flash[:notice] = "チャットを作成しました!" end

    でデータの作成をします。

このような流れでここでは、 の2つをやってみます。
 設定をやっていきましょう!

 まずは チャットを始める をクリックするの設定からやってみます

これをやるには、
  • 「users_controller.rb」に新しい「entries」データ「@entry」を設定(データ操作
  • 「users」データベースの「show」ページに「@entry」の入力欄の設定(ページ表示
の2つをやります。

 1つ目の「users_controller.rb」に「@entry」から設定しましょう!(データ操作

app > controllers > users_controller.rbを開いて下のように内容を変更しましょう!

 users_controller.rb(10行目を追加)
※ 半角英数字で入力。変更が完了したら「Command」と「s」を一緒に押して内容を保存して下さい。
 Windowsをご利用の方は、「ctrl」と「s」を一緒に押して内容を保存して下さい。


5 6 7 8 9 10 11 12 def show @user = User.find(params[:id]) if @user.id == current_user.id else @room = Room.new @entry = Entry.new end end

ここで設定した新しい「entry」データ「@entry」を、app > views > users > show.html.erbに設定します(ページ表示)。

 show.html.erb(12〜14行目を追加)
※ 半角英数字で入力。変更が完了したら「Command」と「s」を一緒に押して内容を保存して下さい。
 Windowsをご利用の方は、「ctrl」と「s」を一緒に押して内容を保存して下さい。


10 11 12 13 14 15 16 17 <% else %> <%= form_for @room do |f| %> <%= fields_for @entry do |e| %> <%= e.hidden_field :user_id, :value => @user.id %> <% end %> <%= f.submit "チャットを始める", :class => "btn btn-warning" %> <% end %> <% end %>

新しい設定が出てきたので、内容を説明しましょう!
今回は

12 <%= fields_for @entry do |e| %>

という新しい設定が出てきましたね。

これは、

11 <%= form_for @room do |f| %>

というrooms」データの作成をする設定の中で、@entry」データの作成の設定を入れるための設定になります。

1 <% end %>

との間にデータの設定を追加します。

ここではhidden_fieldを使って、
「@entry」の「user_id」にページの会員「@user」の「id」を入れる設定をしています。

1 <%= e.hidden_field :user_id, :value => @user.id %>

users_controller.rb」で設定した「@entryの内容

 show.html.erb
12 13 14 <%= fields_for @entry do |e| %> <%= e.hidden_field :user_id, :value => @user.id %> <% end %>

を、rooms_controller.rbでデータの作成をします。

1 @entry2 = Entry.create(params.require(:entry).permit(:user_id, :room_id).merge(:room_id => @room.id))

このparamsの部分に、
  • 「rooms」データ
  • 「entry」データの「user_id」を決めるデータ
が入り、require」と「permitをしてデータの作成をします。

 下のようなデータ操作をしている「new」ページに、「@corporation」の「name」を入力欄を表示するための設定はどのようになるでしょうか?

 users_controller.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 class UsersController < ApplicationController def new @user = User.new @corporation = Corporation.new end def create @user = User.create(params.require(:user).permit(:name)) @corporation = Corporation.create(params.require(:corporation).permit(:name)) end end


 new.html.erb(app > views > users フォルダ
※ マウスを上に置くと答えが出ます
1 2 3 4 5 6 7 8 9 <h1>新しいデータを作成</h1> <hr> <%= form_for @user do |f| %> <%= f.text_field :name %> <%= fields_for @corporation do |c| %> <%= c.text_field :name %> <% end %> <%= f.submit "作成" %> <% end %>

ここまででデータを作成するの設定ができました!
 次に チャットを始める をクリックしたの設定をします。

ここでは、前に設定したデータを「rooms_controller.rb」で作成します。
今の状態では、

 rooms_controller.rb
5 6 7 8 9 10 def create @room = Room.create @entry1 = Entry.create(:room_id => @room.id, :user_id => current_user.id) redirect_to "/rooms/#{@room.id}" flash[:notice] = "チャットを作成しました!" end

@room」と「@entry1の作成をしているんで、ここに@entry2の作成の設定を追加します。

ではapp > controllers > rooms_controller.rbを下のように変更してみましょう!

 rooms_controller.rb(8行目を追加)
※ 半角英数字で入力。変更が完了したら「Command」と「s」を一緒に押して内容を保存して下さい。
 Windowsをご利用の方は、「ctrl」と「s」を一緒に押して内容を保存して下さい。


5 6 7 8 9 10 11 def create @room = Room.create @entry1 = Entry.create(:room_id => @room.id, :user_id => current_user.id) @entry2 = Entry.create(params.require(:entry).permit(:user_id, :room_id).merge(:room_id => @room.id)) redirect_to "/rooms/#{@room.id}" flash[:notice] = "チャットを作成しました!" end

paramsの中には、

 show.html.erb(12〜14行目)
12 13 14 <%= fields_for @entry do |e| %> <%= e.hidden_field :user_id, :value => @user.id %> <% end %>

で設定した「user_id」に「@user」の「id」が入った「@entry」のデータが入っているので、
それを「params」から取り出しています。
※ paramsの説明はこちらを参考にして下さい

1 params.require(:entry).permit(:user_id, :room_id).merge(:room_id => @room.id)

ここでは
  • 「entry」データの「user_id」と「room_id」の変更の許可
  • ※ 詳細はこちらを参考
  • 「room_id」に「@room」の「id」代入
  • ※ 詳細はこちらを参考
をしています。
これで、
  • 「user_id」に「@user」の「id」
  • 「room_id」に「@room」の「id」
が入るデータが作成の設定ができました!

entries
id room_id user_id created_at updated_at
2 1 2 2016-04-12 20:30:21 2016-04-12 20:30:21
 では、実際にデータが作られるかを試してみましょう! Chrome messages users 1 start chat ログインしている会員以外のページの チャットを始める をクリックしてみましょう!

※ 一回rails sで動かしたサーバーを「Control」と「c」を一緒に押して止めてから、もう一度rails sを入力して下さい。

 Windowsをご利用の方は、
 「rails s」で動かしたサーバーを「ctrl」と「c」を一緒に押して停止させ、もう一度「rails s」を再入力して下さい。


Chrome messages rooms 1 no messages no entry のページに移動できると思います。
すでに先ほど「rooms」ページは作成しましたので、0.0.0.0:3000/rooms/2に移動できたのではないかと思います。

できたら、Sequel Proで「entries」データが作成されているかを確認しましょう!
※ Sequel Proの開き方はこちらを、SqliteBrowserの開き方はこちらを参考にして下さい Sequel pro entries ここでは
  • 会員「1」がチャットルーム「2」に参加しているデータ
  • 会員「2」がチャットルーム「2」に参加しているデータ
の2つのデータの作成をしました!
 次にここで作成したデータを使って
  • 「rooms」ページでの参加している会員の表示
  • Chrome messages rooms 1 no messages
  • ログインしている会員の参加しているチャットルーム一覧の表示
  • Chrome messages users 1 link chats 1 Chrome messages rooms
の2つの「データ表示」をやってみます。


 ⑵ : 「entries」データの表示


 次に「entries」データの表示をやってみましょう!
「entries」データの中には、

entries
id room_id user_id created_at updated_at
1 1 1 2016-04-12 20:30:21 2016-04-12 20:30:21
のように、
  • 「rooms」データを設定する枠組み「room_id」
  • 「users」データを設定する枠組み「user_id」
があり、
rooms」データ・「users」データがそれぞれ複数の「entries」データを所持できるので、

 チャットルーム「@room」から「entries」データを選択

1 @entries = @room.entries

 会員「@user」から「@entries」データを選択

1 @entries = @user.entries

 「@entry」データから会員「@user」データを選択

1 @user = @entry.user

 「@entry」からチャットルーム「@room」を選択

1 @room = @entry.room

をできるようにします。
 上の設定ができるようにします。

ここでは
  • app > models > entry.rb
  • app > models > room.rb
  • app > models > user.rb
にそれぞれ設定を加えていきます。
※ 詳細はこちらを参考にして下さい

それぞれのファイルの設定を変更してみます!
※ 詳細はこちらを参考にして下さい

 entry.rb(3、4行目を追加)
※ 半角英数字で入力。変更が完了したら「Command」と「s」を一緒に押して内容を保存して下さい。
 Windowsをご利用の方は、「ctrl」と「s」を一緒に押して内容を保存して下さい。


1 2 3 4 5 6 class Entry < ActiveRecord::Base belongs_to :room belongs_to :user end

 room.rb(4行目を追加)
※ 半角英数字で入力。変更が完了したら「Command」と「s」を一緒に押して内容を保存して下さい。
 Windowsをご利用の方は、「ctrl」と「s」を一緒に押して内容を保存して下さい。


1 2 3 4 5 6 class Room < ActiveRecord::Base has_many :messages has_many :entries end

 user.rb(8行目を追加)
※ 半角英数字で入力。変更が完了したら「Command」と「s」を一緒に押して内容を保存して下さい。
 Windowsをご利用の方は、「ctrl」と「s」を一緒に押して内容を保存して下さい。


1 2 3 4 5 6 7 8 9 10 class User < ActiveRecord::Base # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable has_many :messages has_many :entries end

ここまでで

1 @entries = @room.entries

1 @entries = @user.entries

1 @user = @entry.user

1 @user = @entry.room

を設定できるようになりました!

 これを使って
  • 参加者の情報の表示
  • Chrome messages rooms 1 no messages
  • ログインしている会員の参加しているチャットルームの情報の表示
  • Chrome messages users 1 link chats 1 Chrome messages rooms
をやってみます!

 まずは「参加者の情報の表示」からやってみます!

参加者の情報を表示させるのはrooms」データベースの「show」ページになりますので、
  • rooms_controller.rb(データ操作)
  • show.html.erb(ページ表示)
にそれぞれ設定を加えていきます。
 まずはデータ操作からやってみます!

データ操作をするファイルはapp > controllers > rooms_controller.rbになるので、その内容を下のように変更します。

 rooms_controller.rb(17行目を追加)
※ 半角英数字で入力。変更が完了したら「Command」と「s」を一緒に押して内容を保存して下さい。
 Windowsをご利用の方は、「ctrl」と「s」を一緒に押して内容を保存して下さい。


13 14 15 16 17 18 def show @room = Room.find(params[:id]) @messages = @room.messages @message = Message.new @entries = @room.entries end

この@entriesを使って、会員の表示をしていきます!
 次にページ表示をしてみましょう!

ここでは Chrome messages rooms 1 no messages のように左側のチャットの説明の下に、参加者のデータを表示させます。

このような表示をするには、先ほど設定した

1 @entries = @room.entries



1 <% @entries.each do |e| %>

で一つ一つのデータに分解して、

1 <%= e.user.id %>

のような会員情報に変換します。

ではapp > views > rooms > show.html.erbを開いて内容を設定しましょう!

 show.html.erb(6〜10行目を追加)
※ 半角英数字で入力。変更が完了したら「Command」と「s」を一緒に押して内容を保存して下さい。
 Windowsをご利用の方は、「ctrl」と「s」を一緒に押して内容を保存して下さい。


1 2 3 4 5 6 7 8 9 10 11 12 13 14 ... <br> <div class="row"> <div class="col-xs-3 text-center"> <h4><%= @room.name %></h4> <h4><small><%= @room.explain %></small></h4> <hr> <h4>参加者</h4> <% @entries.each do |e| %> <h5><strong><a href="/users/<%= e.user.id %>"><%= e.user.family_name %> <%= e.user.first_name %>さん</a></strong></h5> <% end %> <hr> <a href="/rooms/<%= @room.id %>/edit" class="btn btn-success">情報を編集する</a> </div> <div class="col-xs-9"> #省略

内容は上で説明した

1 <% @entries.each do |e| %>



1 @entries = @room.entries

「@room」が持っている「@entries」データを1つ1つのデータ「e」に分けます。

entries
id room_id user_id created_at updated_at
1 1 1 2016-04-12 20:30:21 2016-04-12 20:30:21
id room_id user_id created_at updated_at
2 1 2 2016-04-12 20:30:21 2016-04-12 20:30:21
この1つ1つのデータ「e」を使って、会員データの表示をします。

1 <a href="/users/<%= e.user.id %>"><%= e.user.family_name %> <%= e.user.first_name %>さん</a>

 では参加者のデータが表示されるかを確認しましょう!

一回rails sで動かしたサーバーを「Control」と「c」を一緒に押して止めてから、もう一度rails sを入力して下さい。


 Windowsをご利用の方は、
 「rails s」で動かしたサーバーを「ctrl」と「c」を一緒に押して止めてから、もう一度「rails s」を入力して下さい。


ブラウザで「0.0.0.0:3000/rooms/2」を開いてみて下さい。
 Windowsをご利用の方は、「localhost:3000/rooms/2」を開いてみて下さい。 Chrome messages rooms 1 no messages のように参加者のデータが表示されたでしょうか?
 次に、ログインしている会員の参加しているチャットルームの情報を表示をします Chrome messages users 1 link chats 1 Chrome messages rooms
これをするには、

1 @entries = current_user.entries

でログインしている会員の情報が含まれている「entries」データを選択し、
それを表示させます。

ここでは、
  • 「users」データベースの「show」ページ
  • Chrome messages users 1 link chats 1
  • 「rooms」データベースの「index」ページ
  • Chrome messages rooms
の2つのページでこの設定を加えます。
 まずは「users」データベースの「show」ページからやってみましょう!

ここでも
  • データ操作(users_controller.rb)
  • ページ表示(show.html.erb)
の2つのファイルに設定を加えます。

 まずはデータ操作からやってみます!

app > controllers > users_controller.rbを開いて内容を下のように変更しましょう!

 users_controller.rb(8行目を追加)
※ 半角英数字で入力。変更が完了したら「Command」と「s」を一緒に押して内容を保存して下さい。
 Windowsをご利用の方は、「ctrl」と「s」を一緒に押して内容を保存して下さい。


5 6 7 8 9 10 11 12 13 def show @user = User.find(params[:id]) if @user.id == current_user.id @entries = current_user.entries.limit(3) else @room = Room.new @entry = Entry.new end end

ここでは

7 if @user.id == current_user.id

の条件に合う時(表示しているページの会員とログインしている会員が一致している時)に、

9 @entries = @user.entries.limit(3)

で、「@user」の持っている「entries」データを選択しています。

entries
id room_id user_id created_at updated_at
1 1 1 2016-04-12 20:30:21 2016-04-12 20:30:21
id room_id user_id created_at updated_at
3 2 1 2016-04-12 20:30:49 2016-04-12 20:30:49
行の最後に、

9 @entries = @user.entries.limit(3)

「limit(3)」という設定が入っていますが、これは最大で3個までデータを選択する設定になります。
 次に「ページ表示」の設定をしていきます

上で設定した「@entries」を表示させます。
app > views > users > show.html.erbを開いて内容を下のように変更してみましょう!

 show.html.erb(19〜29行目を追加)
※ 半角英数字で入力。変更が完了したら「Command」と「s」を一緒に押して内容を保存して下さい。
 Windowsをご利用の方は、「ctrl」と「s」を一緒に押して内容を保存して下さい。


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 <div class="row"> <div class="col-xs-6"> <h1>ユーザー情報</h1> <hr> <p>名前:<%= @user.family_name %><%= @user.first_name %>さん(<%= @user.age %>歳)</p> <p>自己紹介:<%= @user.self_introduction %></p> <br> <% if @user.id == current_user.id %> <p><a href="/users/<%= @user.id %>/edit" class="btn btn-success">ユーザー情報を編集する</a></p> <% else %> <%= form_for @room do |f| %> <%= fields_for @entry do |e| %> <%= e.hidden_field :user_id, :value => @user.id %> <% end %> <%= f.submit "チャットを始める", :class => "btn btn-warning" %> <% end %> <% end %> </div> <% if @user.id == current_user.id %> <div class="col-xs-6"> <h1>チャット一覧</h1> <hr> <% @entries.each do |e| %> <p><a href="/rooms/<%= e.room.id %>"><strong><%= e.room.name %></strong></a></p> <hr> <% end %> <a href="/rooms" class="btn btn-info">チャット一覧を見る</a> </div> <% end %> </div> <hr> <p><a href="/users" class="btn btn-primary">ユーザー一覧に戻る</a></p>

ここでは

19 <% if @user.id == current_user.id %>

でログインしている会員と「@user」が一致する時にだけ、内容を表示する設定をしています。

表示する内容は、

20 <div class="col-xs-6">

ユーザー情報

チャット情報

でページの表示を分け、
※ 詳細はこちらを参考

23 <% @entries.each do |e| %>

@entriesを一つ一つのデータ「e」に分け、
それを一つ一つ表示させています。

24 <p><a href="/rooms/<%= e.room.id %>"><strong><%= e.room.name %></strong></a></p>

 ここまでできたら、表示できるかを確認しましょう!

一回rails sで動かしたサーバーを「Control」と「c」を一緒に押して止めてから、もう一度rails sを入力して下さい。


 Windowsをご利用の方は、
 「rails s」で動かしたサーバーを「ctrl」と「c」を一緒に押して止めてから、もう一度「rails s」を入力して下さい。


ブラウザで、ログインしている会員のページ0.0.0.0:3000/users/数字を開いてみて下さい。
 Windowsをご利用の方は、localhost:3000/users/数字を開いてみて下さい。 Chrome messages users 1 link chats 1 のように右側にログインしている会員が参加しているチャット情報が表示されたでしょうか?
 次に「rooms」データベースの「index」ページをやってみます!

ここでも
  • データ操作(users_controller.rb)
  • ページ表示(index.html.erb)
の2つのファイルに設定を加えるんですが、前に一回設定をしたので、その設定を変更してみます。

 まずはデータ操作からやってみます!

app > controllers > rooms_controller.rbを開いて内容を下のように変更しましょう!

 rooms_controller.rb(21行目を変更)
※ 半角英数字で入力。変更が完了したら「Command」と「s」を一緒に押して内容を保存して下さい。
 Windowsをご利用の方は、「ctrl」と「s」を一緒に押して内容を保存して下さい。


20 21 22 def index @entries = current_user.entries end

これで「current_user」が持っている「entries」データの選択をすることができました!
 次にページ表示をやってみます!

上で設定した「@entries」を表示させます!
app > views > rooms > index.html.erbを下のように変更しましょう!

 index.html.erb(3〜6行目を変更)
※ 半角英数字で入力。変更が完了したら「Command」と「s」を一緒に押して内容を保存して下さい。
 Windowsをご利用の方は、「ctrl」と「s」を一緒に押して内容を保存して下さい。


1 2 3 4 5 6 7 8 <h1>チャット一覧</h1> <hr> <% @entries.each do |e| %> <a href="/rooms/<%= e.room_id %>"><%= e.room.name %></a> <hr> <% end %> <p><a href="/users/<%= current_user.id %>" class="btn btn-primary"><%= current_user.family_name %> <%= current_user.first_name %>さんの情報に戻る</a></p> <p><a href="/" class="btn btn-info">トップに戻る</a></p>

ここでも上と同じように@entriesを一つ一つのデータ「e」に分けて表示させています。
 ここまでできたら、表示できるかを確認しましょう!

一回rails sで動かしたサーバーを「Control」と「c」を一緒に押して止めてから、もう一度rails sを入力して下さい。


 Windowsをご利用の方は、
 「rails s」で動かしたサーバーを「ctrl」と「c」を一緒に押して止めてから、もう一度「rails s」を入力して下さい。


ブラウザで、「rooms」データベースの「index」ページ「0.0.0.0:3000/rooms」を開いてみて下さい。
 Windowsをご利用の方は、「localhost:3000/rooms」を開いてみて下さい。 Chrome messages rooms のような表示がでてきたでしょうか?
ここまででチャットルームの作成ができました。

せっかくチャットルームの参加状況を示す「entries」データを作成したのに、
今のままでは参加していないユーザーからもチャットルームの情報を見れるようになっています。 Chrome messages rooms 1 no messages  次はチャットルームに参加している会員以外がチャットルームを見ようとしたら、

無効なユーザー

を表示させるようにしましょう!


 ⑶ : チャットルーム閲覧の制限


 次に、参加者だけに「rooms」データベースのページ・チャットルームの閲覧をできるようにしてみましょう!
チャットルームの参加者のデータはentries」データで示しました。

entries
id room_id user_id created_at updated_at
1 1 1 2016-04-12 20:30:21 2016-04-12 20:30:21
このentries」データを使って、チャットルームにログインしている会員(current_userが参加しているかを判定します。

これには、entries」データベース
  • 「room_id」に、チャットルームの「id」
  • 「user_id」に、「current_user」の「id」
が入っているデータがあるかどうかで判定します。

これを設定するには、
  • 「if/else」(詳細はこちらを参考)
  • 「where」を使ったデータの検索(詳細はこちらを参考)
  • 「present?」でデータがあるかを確認
の3つを使います。
 この判定を「rooms_controller.rb」に追加してみたいと思います!

ここで制限をかけるrooms」データベースのページは、
  • show
  • Chrome messages rooms 1 no messages
  • edit
  • Chrome messages rooms 1 edit
  • update
  • Chrome messages rooms 1 update
の3つになります。

 まずは「show」ページでの設定からやってみます!

app > controllers > rooms_controller.rbを開いて、内容を下のように変更しましょう!

 rooms_controller.rb(20、24〜26行目を追加)
※ 半角英数字で入力。変更が完了したら「Command」と「s」を一緒に押して内容を保存して下さい。
 Windowsをご利用の方は、「ctrl」と「s」を一緒に押して内容を保存して下さい。


18 19 20 21 22 23 24 25 26 27 28 def show @room = Room.find(params[:id]) if Entry.where(:user_id => current_user.id, :room_id => @room.id).present? @messages = @room.messages @message = Message.new @entries = @room.entries else redirect_to :back flash[:alert] = "無効なユーザー" end end

 では、内容を説明しましょう!

今回の設定で難しいのは、

20 if Entry.where(:user_id => current_user.id, :room_id => @room.id).present?

の1行だと思います。

ここでは前に触れた、
  • 「if/else」
  • 「where」を使ったデータの検索
  • 「present?」でデータがあるかを確認
を使っています。
1つ目については分かると思うので、2つ目から説明していきます。

 2. 「where」を使ったデータの検索

ここではentries」データから
  • 「room_id」が、「@room」の「id」
  • 「user_id」が、「current_user」の「id」
の2つを満たすデータを検索して、選択しています。
※ 詳細はこちらを参考にして下さい

 3 . 「present?」でデータがあるかを確認

ここでは

1 Entry.where(:user_id => current_user.id, :room_id => @room.id)

で選択したentries」データがあるかないかを判定しています。
ここでの判定結果に従って、

  • あった場合は「if」の内容を設定

  • 21 22 23 @messages = @room.messages @message = Message.new @entries = @room.entries

  • なかった場合は「else」の設定

  • 25 26 redirect_to :back flash[:alert] = "無効なユーザー"

を適用させます。
 今回の設定内容をまとめます。

チャットルーム「@room」にログインしている会員「current_user」が参加しているかを判定するには、

1 if Entry.where(:user_id => current_user.id, :room_id => @room.id).present?

と設定して判定をします。

これと同じ方法を使って「edit」「update」ページにも設定を追加します。
 次に「edit」ページの設定をやります。

app > controllers > rooms_controller.rbを開いて、内容を下のように変更しましょう!

 rooms_controller.rb(36〜40行目を追加)
※ 半角英数字で入力。変更が完了したら「Command」と「s」を一緒に押して内容を保存して下さい。
 Windowsをご利用の方は、「ctrl」と「s」を一緒に押して内容を保存して下さい。


34 35 36 37 38 39 40 41 def edit @room = Room.find(params[:id]) if Entry.where(:user_id => current_user.id, :room_id => @room.id).present? else flash[:alert] = "無効なユーザー" redirect_to :back end end

これでチャットルームに参加していないユーザーは、「edit」ページに移動できないようになりました。
 最後に「update」ページをやります。

app > controllers > rooms_controller.rbを開いて、内容を下のように変更しましょう!

 rooms_controller.rb(39、43〜46行目を追加)
※ 半角英数字で入力。変更が完了したら「Command」と「s」を一緒に押して内容を保存して下さい。
 Windowsをご利用の方は、「ctrl」と「s」を一緒に押して内容を保存して下さい。


37 38 39 40 41 42 43 44 45 46 47 def update @room = Room.find(params[:id]) if Entry.where(:user_id => current_user.id, :room_id => @room.id).present? @room.update(params.require(:room).permit(:name, :explain)) flash[:notice] = "チャット情報が変更されました" redirect_to :back else flash[:alert] = "無効なユーザー" redirect_to :back end end

これで「rooms」データベースの
  • 「show」ページ
  • 「edit」ページ
  • 「update」ページ
に閲覧する会員の制限をかけることができました!
 ついでに「messages」データの作成でも、同じ「チャットルームに参加しているか」の判定をしてみます。

メッセージデータの作成はapp > controllers > messages_controller.rbで行いました。
内容は下のような感じだったと思います。

 messages_controller.rb
1 2 3 4 5 6 7 8 9 10 class MessagesController < ApplicationController before_action :authenticate_user!, :only => [:create] def create @message = Message.create(params.require(:message).permit(:user_id, :content, :room_id).merge(:user_id => current_user.id)) redirect_to :back end end

ここにさきほど設定した、

1 if Entry.where(:user_id => current_user.id, :room_id => @room.id).present?

を設定します。
ですが今回は@roomがないので、
「messages」データの入力欄を表示したrooms」データベースの「show」ページ Chrome messages rooms 1 no messages no entry のページの表示を設定したapp > views > rooms > show.html.erb

 show.html.erb(36〜43行目)
36 37 38 39 40 41 42 43 <%= form_for @message do |f| %> <%= f.text_field :content, :class => "form-control myform", :placeholder => "メッセージを入力して下さい" %> <%= f.hidden_field :room_id, :value => @room.id %> <br> <div class="text-center"> <%= f.submit "投稿する", :class => "btn btn-primary" %> </div> <% end %>



38 <%= f.hidden_field :room_id, :value => @room.id %>

に入っている「room_id」のデータを、データ操作の「controller」ファイルで設定します。
「controller」ファイルで送られてきたデータは、
params
に集約されました。
※ 内容はこちらを参考にして下さい

このparamsを使って、チャットルームの情報を取得します。
params

1 @post = Post.create(params.require(:post).permit(:name, :content, :place))

のような形で使いました。

今回はこのparamsからデータを取り出します。
ではapp > controllers > messages_controller.rbの内容を下のように変更しましょう!

 messages_controller.rb(6、8〜10行目を追加)
※ 半角英数字で入力。変更が完了したら「Command」と「s」を一緒に押して内容を保存して下さい。
 Windowsをご利用の方は、「ctrl」と「s」を一緒に押して内容を保存して下さい。


5 6 7 8 9 10 11 12 def create if Entry.where(:user_id => current_user.id, :room_id => params[:message][:room_id]).present? @message = Message.create(params.require(:message).permit(:user_id, :content, :room_id).merge(:user_id => current_user.id)) else flash[:alert] = "無効なユーザー" end redirect_to :back end

6行目で判定をしていますね。判定の条件は、

1 Entry.where(:user_id => current_user.id, :room_id => params[:message][:room_id]).present?

「user_id」と「room_id」の条件に合った検索をしています。

「user_id」「current_user」の「id」なのですが、
「room_id」は、

1 :room_id => params[:message][:room_id]

のようになっています。この中にある

1 params[:message][:room_id]

で、送信されてきたデータparamsの中のmessage」データの「room_id」の枠組みを選択しています。
ここまでの条件判定で、
  • 条件に合うときは

  • 7 @message = Message.create(params.require(:message).permit(:user_id, :content, :room_id).merge(:user_id => current_user.id))

    でデータの作成

  • 条件に合わないときは

  • 9 flash[:alert] = "無効なユーザー"

    無効なユーザー

を表示させ
最後の

1 redirect_to :back

で一つ前のページに移動させています。


  ここまでで、チャットルームに参加している会員の情報「entries」データについて触れました。

具体的には、
  • 「entries」データの作成
  • 「entries」データの表示
  • 「entries」データを使った、チャットルーム閲覧の制限
の3つをやりました。


 一回、この章で設定した内容をまとめましょう!

設定した内容はこちらにまとめてあります。