如何要求用户请求组成员资格?
How to require users to request group membership?
我有一个用户模型、一个组模型 (Cliq) 和一个 group_membership 模型 (Cliq_Membership)。到目前为止,一切似乎都运行良好。我目前拥有它,这样当一个用户创建一个组时,他们 "own" 它并且当一个 "owner" 离开该组(破坏他们的组成员资格)时,整个组被破坏。一个组有一个所有者和许多成员。我想让用户必须请求成为 "member"。我希望 "owner" 是唯一能看到请求和 accept/deny 请求的人。
为清楚起见:
- 我希望用户必须申请成为群组成员
- 我希望 Cliqs 能够请求用户成为会员
- 只有所有者才能看到/accept/deny 好友请求
- 我希望关系是"two-way/self-referential";也就是说,我希望 User/Member 显示为包含在该组中,并且该组显示为有另一个成员
- Cliqs = 组
你是如何做到这一点的?
到目前为止,这是我的代码:
型号:
class User < ActiveRecord::Base
has_many :uploads
has_one :owned_cliq, foreign_key: 'owner_id', class_name: 'Cliq', dependent: :destroy
has_many :cliq_memberships
has_many :cliqs, through: :cliq_memberships
end
class CliqMembership < ActiveRecord::Base
belongs_to :cliq
belongs_to :user
end
class Cliq < ActiveRecord::Base
belongs_to :owner, class_name: 'User'
has_many :cliq_memberships, dependent: :destroy
has_many :members, through: :cliq_memberships, source: :user
end
控制器:
class CliqMembershipsController < ApplicationController
def create
#Cliq or Cliq_ID?
@cliq = Cliq.find(params[:cliq])
@cliq_membership = current_user.cliq_memberships.build(cliq: @cliq)
@cliq.members << current_user
if @cliq_membership.save
flash[:notice] = "Joined #{@cliq.name}"
else
flash[:notice] = "Not able to join Cliq."
end
redirect_to cliq_url
end
def destroy
@cliq_membership = current_user.cliq_memberships.find(params[:id])
@cliq = @cliq_membership.cliq
if @cliq.owner == current_user
@cliq.destroy
flash[:notice] = "Cliq has been deleted."
redirect_to current_user
else
@cliq_membership.destroy
flash[:notice] = "You left the Cliq."
redirect_to current_user
end
end
end
class CliqsController < ApplicationController
def show
@cliq = Cliq.find(params[:id])
end
def new
@cliq = Cliq.new(params[:id])
end
def create
@cliq = current_user.build_owned_cliq(cliq_params)
@cliq.members << current_user
if @cliq.save
redirect_to current_user
else
redirect_to new_cliq_path
end
end
def destroy
#@cliq = current_user.owned_cliq.find(params[:id])
#lash[:alert] = "Are you sure you want to delete your Cliq? Your Cliq and all of its associations will be permanently deleted."
#@cliq.destroy
#if @cliq.destroy
#redirect_to current_user
#flash[:notice] = "You deleted the Cliq."
#else
#redirect_to current_user
#set up error handler
#flash[:notice] = "Failed to delete Cliq."
#end
end
def cliq_params
params.require(:cliq).permit(:name, :cliq_id)
end
end
您可以创建另一个模型和控制器来处理用户请求
创建request.rb
模型
class Request < ActiveRecord::Base
belongs_to :user
belongs_to :cliq
end
创建 requests_controller.rb
.
class RequestsController < ApplicationController
before_action :set_group
before_action :auth_group_owner
before_action :find_request, except: [:index, :create]
def index
end
def create
@grp.requests.where(user_id: current_user.id).first_or_create
# redirect the user
end
def approv
# add the user to the group
@request.destroy
# redirect
end
def destroy
#delete the request
end
private
def set_group
#find group @grp
end
def auth_group_owner
if current_user != @grp.owner
redirect
end
end
def find_request
#find request
end
end
你的routes.rb
resources :groups do
resources :requests, only: [:index, :destroy] do
member do
get 'approv'
end
end
end
以下解决方案无需为请求创建新模型即可工作。向 CliqMembership 模型添加一个新的布尔字段以存储特定 cliq_memberhip 是否已确认就足够了。 (例如,我们将该字段称为 'confirmed')
class User < ActiveRecord::Base
has_many :cliq_memberships
has_many :cliqs, through: :cliq_memberships
has_many :confirmed_memberships, -> { confirmed }, class_name: "CliqMembership"
has_many :confirmed_cliqs, through: :confirmed_memberships, source: :cliq
end
class CliqMembership < ActiveRecord::Base
belongs_to :cliq
belongs_to :user
scope :confirmed, -> { where(confirmed: true) }
end
class Cliq < ActiveRecord::Base
has_many :cliq_memberships, dependent: :destroy
has_many :members, through: :cliq_memberships, source: :user
has_many :confirmed_memberships, { confirmed }, class_name: "CliqMembership"
has_many :confirmed_members, through: :confirmed_memberships, source: :user
end
有了这个,当用户创建一个新的cliq_membership时,你可以将confirmed
字段的值默认设置为false
。直到所有者 update
的那个特定 cliq_membership 将 confirmed
的值更改为 true
。
假设 user
和 cliq
分别是 User 模型和 Cliq 模型的实例,您现在可以使用 user.confirmed_cliqs
和 cliq.confirmed_members
。
编辑:
为了将 cliq_membership 上的编辑和更新操作仅限于 cliq 所有者,您可以使用 before 过滤器。
class CliqMembershipsController < ApplicationController
before_action :cliq_owner, only: [:edit, :update]
def edit
@cliq_membership = CliqMembership.find(params[:id])
end
def update
@cliq_membership = CliqMembership.find(params[:id])
@cliq_membership.update_attributes(cliq_membership_params)
end
private
def cliq_membership_params
params.require(:cliq_membership).permit(:cliq_id, :user_id, :confirmed)
end
def cliq_owner
@cliq = CliqMembership.find(params[:id]).cliq
redirect_to root_url unless @cliq.owner == current_user
end
end
希望对你有用。
我有一个用户模型、一个组模型 (Cliq) 和一个 group_membership 模型 (Cliq_Membership)。到目前为止,一切似乎都运行良好。我目前拥有它,这样当一个用户创建一个组时,他们 "own" 它并且当一个 "owner" 离开该组(破坏他们的组成员资格)时,整个组被破坏。一个组有一个所有者和许多成员。我想让用户必须请求成为 "member"。我希望 "owner" 是唯一能看到请求和 accept/deny 请求的人。
为清楚起见:
- 我希望用户必须申请成为群组成员
- 我希望 Cliqs 能够请求用户成为会员
- 只有所有者才能看到/accept/deny 好友请求
- 我希望关系是"two-way/self-referential";也就是说,我希望 User/Member 显示为包含在该组中,并且该组显示为有另一个成员
- Cliqs = 组
你是如何做到这一点的?
到目前为止,这是我的代码:
型号:
class User < ActiveRecord::Base
has_many :uploads
has_one :owned_cliq, foreign_key: 'owner_id', class_name: 'Cliq', dependent: :destroy
has_many :cliq_memberships
has_many :cliqs, through: :cliq_memberships
end
class CliqMembership < ActiveRecord::Base
belongs_to :cliq
belongs_to :user
end
class Cliq < ActiveRecord::Base
belongs_to :owner, class_name: 'User'
has_many :cliq_memberships, dependent: :destroy
has_many :members, through: :cliq_memberships, source: :user
end
控制器:
class CliqMembershipsController < ApplicationController
def create
#Cliq or Cliq_ID?
@cliq = Cliq.find(params[:cliq])
@cliq_membership = current_user.cliq_memberships.build(cliq: @cliq)
@cliq.members << current_user
if @cliq_membership.save
flash[:notice] = "Joined #{@cliq.name}"
else
flash[:notice] = "Not able to join Cliq."
end
redirect_to cliq_url
end
def destroy
@cliq_membership = current_user.cliq_memberships.find(params[:id])
@cliq = @cliq_membership.cliq
if @cliq.owner == current_user
@cliq.destroy
flash[:notice] = "Cliq has been deleted."
redirect_to current_user
else
@cliq_membership.destroy
flash[:notice] = "You left the Cliq."
redirect_to current_user
end
end
end
class CliqsController < ApplicationController
def show
@cliq = Cliq.find(params[:id])
end
def new
@cliq = Cliq.new(params[:id])
end
def create
@cliq = current_user.build_owned_cliq(cliq_params)
@cliq.members << current_user
if @cliq.save
redirect_to current_user
else
redirect_to new_cliq_path
end
end
def destroy
#@cliq = current_user.owned_cliq.find(params[:id])
#lash[:alert] = "Are you sure you want to delete your Cliq? Your Cliq and all of its associations will be permanently deleted."
#@cliq.destroy
#if @cliq.destroy
#redirect_to current_user
#flash[:notice] = "You deleted the Cliq."
#else
#redirect_to current_user
#set up error handler
#flash[:notice] = "Failed to delete Cliq."
#end
end
def cliq_params
params.require(:cliq).permit(:name, :cliq_id)
end
end
您可以创建另一个模型和控制器来处理用户请求
创建request.rb
模型
class Request < ActiveRecord::Base
belongs_to :user
belongs_to :cliq
end
创建 requests_controller.rb
.
class RequestsController < ApplicationController
before_action :set_group
before_action :auth_group_owner
before_action :find_request, except: [:index, :create]
def index
end
def create
@grp.requests.where(user_id: current_user.id).first_or_create
# redirect the user
end
def approv
# add the user to the group
@request.destroy
# redirect
end
def destroy
#delete the request
end
private
def set_group
#find group @grp
end
def auth_group_owner
if current_user != @grp.owner
redirect
end
end
def find_request
#find request
end
end
你的routes.rb
resources :groups do
resources :requests, only: [:index, :destroy] do
member do
get 'approv'
end
end
end
以下解决方案无需为请求创建新模型即可工作。向 CliqMembership 模型添加一个新的布尔字段以存储特定 cliq_memberhip 是否已确认就足够了。 (例如,我们将该字段称为 'confirmed')
class User < ActiveRecord::Base
has_many :cliq_memberships
has_many :cliqs, through: :cliq_memberships
has_many :confirmed_memberships, -> { confirmed }, class_name: "CliqMembership"
has_many :confirmed_cliqs, through: :confirmed_memberships, source: :cliq
end
class CliqMembership < ActiveRecord::Base
belongs_to :cliq
belongs_to :user
scope :confirmed, -> { where(confirmed: true) }
end
class Cliq < ActiveRecord::Base
has_many :cliq_memberships, dependent: :destroy
has_many :members, through: :cliq_memberships, source: :user
has_many :confirmed_memberships, { confirmed }, class_name: "CliqMembership"
has_many :confirmed_members, through: :confirmed_memberships, source: :user
end
有了这个,当用户创建一个新的cliq_membership时,你可以将confirmed
字段的值默认设置为false
。直到所有者 update
的那个特定 cliq_membership 将 confirmed
的值更改为 true
。
假设 user
和 cliq
分别是 User 模型和 Cliq 模型的实例,您现在可以使用 user.confirmed_cliqs
和 cliq.confirmed_members
。
编辑:
为了将 cliq_membership 上的编辑和更新操作仅限于 cliq 所有者,您可以使用 before 过滤器。
class CliqMembershipsController < ApplicationController
before_action :cliq_owner, only: [:edit, :update]
def edit
@cliq_membership = CliqMembership.find(params[:id])
end
def update
@cliq_membership = CliqMembership.find(params[:id])
@cliq_membership.update_attributes(cliq_membership_params)
end
private
def cliq_membership_params
params.require(:cliq_membership).permit(:cliq_id, :user_id, :confirmed)
end
def cliq_owner
@cliq = CliqMembership.find(params[:id]).cliq
redirect_to root_url unless @cliq.owner == current_user
end
end
希望对你有用。