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)」的设定,这个是选择最大三个以內的资料的设定。
 接着设定「网页显示」吧。

显示在上面设定的「@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」资料,限制聊天室的阅览
这些三个。


 最后,总括里面的內容吧!

设定的內容请参考这里吧。