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

前章の内容がまだ終わっていない方は、こちらからお願いします。
② : 「entries」データの作成・表示
では、「entries」データベースの作成・表示の設定をしてみましょう!
ここでは、
- 「users」の「show」ページでの「entries」データの作成(create)
- 「rooms」の「show」ページでの「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 |
---|---|---|---|---|
1 | 1 | 2 | 2016-04-12 20:30:21 | 2016-04-12 20:30:21 |
チャットルームに参加している会員の表示

ログインしている会員の参加しているチャットルームの表示


チャットルームに参加している会員でなければ、チャットルームを見れないようにします。
ログインしている会員がチャットルームに参加しているかどうかは、
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 |
の3つをしてみます。
まずは「entries」データの作成(create)からやってみましょう!
⑴ : 「entries」データの作成(create)
まず「entries」データの作成をやってみましょう!
「entries」データの作成には、
1 | Entry.create(:user_id => 数字, :room_id => 数字) |
を、データ操作のファイル(controllerファイル)に追加することで設定します。
今回の「entries」データは、

なので、
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」
もし、ログインいる会員の「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」データを作成するボタン チャットを始める を作っている
- チャットを始める をクリックすると「rooms_controller.rb」で
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
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」の入力欄の設定(ページ表示)
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」を決めるデータ
下のようなデータ操作をしている「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) |
ここでは をしています。
これで、
- 「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 |

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

すでに先ほど「rooms」ページは作成しましたので、「0.0.0.0:3000/rooms/2」に移動できたのではないかと思います。
できたら、Sequel Proで「entries」データが作成されているかを確認しましょう!
※ Sequel Proの開き方はこちらを、SqliteBrowserの開き方はこちらを参考にして下さい

- 会員「1」がチャットルーム「2」に参加しているデータ
- 会員「2」がチャットルーム「2」に参加しているデータ
次にここで作成したデータを使って の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 |
を設定できるようになりました!
これを使って をやってみます!
まずは「参加者の情報の表示」からやってみます!
参加者の情報を表示させるのは「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」を使って、会員の表示をしていきます!
次にページ表示をしてみましょう!
ここでは

このような表示をするには、先ほど設定した
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 | <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」を開いてみて下さい。

次に、ログインしている会員の参加しているチャットルームの情報を表示をします


これをするには、
1 | @entries = current_user.entries |
でログインしている会員の情報が含まれている「entries」データを選択し、
それを表示させます。
ここでは、 の2つのページでこの設定を加えます。
まずは「users」データベースの「show」ページからやってみましょう!
ここでも
- データ操作(users_controller.rb)
- ページ表示(show.html.erb)
まずはデータ操作からやってみます!
「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/数字」を開いてみて下さい。

次に「rooms」データベースの「index」ページをやってみます!
ここでも
- データ操作(users_controller.rb)
- ページ表示(index.html.erb)
まずはデータ操作からやってみます!
「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」を開いてみて下さい。

ここまででチャットルームの作成ができました。
せっかくチャットルームの参加状況を示す「entries」データを作成したのに、
今のままでは参加していないユーザーからもチャットルームの情報を見れるようになっています。

無効なユーザー
を表示させるようにしましょう!⑶ : チャットルーム閲覧の制限
次に、参加者だけに「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」データベースの
- 「room_id」に、チャットルームの「id」
- 「user_id」に、「current_user」の「id」
これを設定するには、 の3つを使います。
この判定を「rooms_controller.rb」に追加してみたいと思います!
ここで制限をかける「rooms」データベースのページは、 の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」
※ 詳細はこちらを参考にして下さい
3 . 「present?」でデータがあるかを確認
ここでは
1 | Entry.where(:user_id => current_user.id, :room_id => @room.id) |
で選択した「entries」データがあるかないかを判定しています。
ここでの判定結果に従って、
- あった場合は「if」の内容を設定
- なかった場合は「else」の設定
21 22 23 | @messages = @room.messages
@message = Message.new
@entries |
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」ページ

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 |
で一つ前のページに移動させています。