5 : 作聊天室③

上章 : 作聊天室②

Coffeecup header5 這個章是,上章「作聊天室②」繼續的內容。
還沒看完上章的內容的話,請參考這裡吧。

 ② : 新增・顯示「entries」資料


 那麽,設定「entries」資料的新增・顯示吧!
在這裡設定
  • 「users」的「show」網頁上,新增「entries」資料(create)
  • Chrome messages users 1 start chat 點擊 開始聊天 會新增「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
     哪一個會員在參加哪一個聊天室的資料。

  • 「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」資料。

設定這個三個內容。

首先從新增「entries」資料(create開始做吧!

 ⑴ : 新增「entries」資料(create)


 首先新增「entries」資料吧!
新增「entries」資料要在資料操作文件(controller文件

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

追加上面的內容。

這一次的「entries」資料的設定是 Chrome messages users 1 start chat 點擊 開始聊天rooms」資料的時候會一起新增「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」
的「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
    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

    在「rooms_controller.rb」裡作新的資料。

所以在這裡設定 這個兩個內容吧。
 那麽開始設定內容吧!

 首先從,點擊 開始聊天 之前的設定做起吧。

設定這個要做
  • 「users_controller.rb」裡設定新的「entries」資料「@entry」(資料操作
  • 「users」資料庫的「show」網頁裡設定「@entry」的輸入框(顯示網頁
這個兩個設定。

 從第一個設定,在「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

app > views > users > show.html.erb裡面設定,在這裡作的新的「entry」資料「@entry」(網頁顯示)。

 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 從不是自己的會員的網頁以外,點擊 開始聊天 吧!

※ 一起點擊「Command」跟「c」停止,用rails s打開的服務器之後,再打入「rails s」吧。

 使用Windows的話、
 一起點擊「ctrl」跟「c」停止,用「rails s」打開的服務器之後,再打入「rails s」吧。


Chrome messages rooms 1 no messages no entry 應該移動到這樣的網頁吧。
已經作好「rooms」網頁了,應該移動到0.0.0.0:3000/rooms/2網頁。

作好了之後,用Sequel Pro / SqliteBrowser 看看「entries」資料有沒有作好了沒
※ 打開Sequel Pro的方法請參考這裡,打開SqliteBrowser的方法請參考這裡 Sequel pro entries 在這裡作了
  • 表示會員「1」在參加聊天室「2」的資料
  • 表示會員「2」在參加聊天室「2」的資料
這個兩個資料!
 接著使用新增的資料,
  • 在「rooms」網頁上,顯示參加的會員
  • Chrome messages rooms 1 no messages
  • 顯示登入的會員在參加的聊天室一覽
  • Chrome messages users 1 link chats 1 Chrome messages rooms
做這個兩個「顯示資料」吧。


 設定的內容,請參考這裡


 ⑵ : 顯示「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」資料分成一個一個的資料「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
使用這個一個一個的資料「e」,顯示會員資料。

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

 那麽,看看參加者的資料會不會顯示!

一起點擊「Command」跟「c」停止,用「rails s」打開的服務器之後,再打入「rails s」吧。
這樣編輯好的內容會適用在網頁上。


 使用Windows的話、
 一起點擊「ctrl」跟「c」停止,用「rails s」打開的服務器之後,再打入「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

這個設定選擇,裡面有「user_id」是登入會員的「id」的「entries」資料。網頁上顯示這個「entries」資料。

在這裡
  • 「users」資料庫的「show」網頁
  • Chrome messages users 1 link chats 1
  • 「rooms」資料庫的「index」網頁
  • Chrome messages rooms
在這個兩個網頁上,設定這個內容。
 首先從「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>

 到這裡,看看可不可以顯示內容!

一起點擊「Command」跟「c」停止,用「rails s」打開的服務器之後,再打入「rails s」吧。
這樣編輯好的內容會適用在網頁上。


 使用Windows的話、
 一起點擊「ctrl」跟「c」停止,用「rails s」打開的服務器之後,再打入「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)
這個兩個文件文件夾設定內容。

 那麽從資料操作開始做吧!

編輯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」,之後顯示這個資料「e」。
 到這裡,看看可不可以顯示!

一起點擊「Command」跟「c」停止,用「rails s」打開的服務器之後,再打入「rails s」吧。
這樣編輯好的內容會適用在網頁上。


 使用Windows的話、
 一起點擊「ctrl」跟「c」停止,用「rails s」打開的服務器之後,再打入「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」
的資料。

為了設定這個,使用 這個三個設定。
 在「rooms_controller.rb」裡追加這個判別吧!

在這裡,限制閱覽的rooms」資料庫的網頁是,
  • show
  • Chrome messages rooms 1 no messages
  • edit
  • Chrome messages rooms 1 edit
  • update
  • Chrome messages rooms 1 update
這個三個網頁。

 首先從「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?

這個一行。

在這裡使用,
  • 「if/else」
  • 「where」搜索資料
  • 「present?」確認資料有沒有
這些設定。
第一個應該知道,所以從第二個開始解釋。

 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」裡面的內容

  • 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」的資料吧。點擊「投稿」的時候,這個「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] = "無效的會員"

    這樣顯示

    無效的會員


最後使用

11 redirect_to :back

移動到上頁了。

 設定的內容,請參考這裡


  到這裡,解釋了參加聊天室的會員資料「entries」的內容。

設定的內容是
  • 新增「entries」資料
  • 新增「entries」資料
  • 用「entries」資料,限制聊天室的閱覽
這些三個。


 最後,總括裡面的內容吧!

設定的內容請參考這裡吧。