保华的Rails学习笔记

加入群组与退出群组知识点提取

1、加入群组(join group)与退出群组(quit group)功能的实现,是在group这个controller里边实现的,所以并没有产生新的controller。group_controller.rb中,join与quit的代码如下:

def join
    @group = Group.find(params[:id])
    if !current_user.is_member_of(@group)
      current_user.join!(@group)
      flash[:notice] = "加入本讨论版成功"
    else
      flash[:warning] = "你已是本讨论版成员了"
    end
    redirect_to group_path(@group)

  end
  def quit
    @group = Group.find(params[:id])
    if current_user.is_member_of(@group)
      current_user.quit!(@group)
      flash[:alert] = "退出本讨论版成功"
    else
      flash[:warning] = "你不是本讨论版成员,怎么退出"
    end
    redirect_to group_path(@group)
  end

2、加入群组与退出群组的实现,仅仅是产生了一个model来实现的。
即group_relationship.rb,这个model仅有两个栏目,group_id与user_id,它实现的是记录了谁(user_id)参加了哪个群组(group_id)

class GroupRelationship < ApplicationRecord
  belongs_to :user
  belongs_to :group
end

group_relationship.rb与user.rb以及group.rb这两个model文件要建立关联关系
grop.rb文件内容如下:

class Group < ApplicationRecord
  validates :title, presence: true
  belongs_to :user
  has_many :posts
  has_many :group_relationships
  has_many :members, through: :group_relationships, source: :user
end

user.rb文件内容如下:

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  has_many :groups
  has_many :posts
  has_many :group_relationships
  has_many :participated_groups,through: :group_relationships,source: :group
  def is_member_of(group)
    participated_groups.include?(group)
  end

  def join!(group)
    participated_groups << group
  end

  def quit!(group)
    participated_groups.delete(group)
  end

end

3、show.html.erb中关于加入群组、退出群组的代码如下:

<span class="pull-right">
      <% if current_user && current_user.is_member_of(@group) %>
        <label class="label label-success">群组成员</label>
        <%= link_to("Quit Group",quit_group_path(@group),method: :post, class: "btn btn-default") %>

      <% else %>
        <label class="label label-warning">不是群组成员</label>
        <%= link_to("Join Group",join_group_path(@group),method: :post, class: "btn btn-default") %>
      <% end %>
    </span>

4、join与quit是在group_controller中写的action,它是在CRUD之外新的action,所以join与quit的path的产生,在routes.rb中要用member do来实现,代码如下:

Rails.application.routes.draw do
  devise_for :users
  resources :groups do
    member do
      post :join
      post :quit
    end

    resources :posts
  end
  root 'groups#index'
end

5、其实在view页面中,直接用model中定义的join!和quit!也能实现加入与退出群组,上次试验过,需要刷新一下页面,感觉还是加在controller中比较好,一是可以产生路径path,用link_to比较方便写path,二是用link_to形式实现很方便,点击就可以,不用刷新页面。
6、符号<<表示加入的意思,在rails console中试验过,user.groups << group这样的写法,实现的是把某个群组的创建者更新为这个user,相反的,user.groups.delete(group)实现的是退出某个群组的创建者,都可以用rails console来试验的,推而广之,user.groups << group这样的写法,在一些一对多的model对应关系中,都可以用这种写法来实现某些功能。