ruby-on-rails 处理帐户/组织销毁多个用户,重定向

k2arahey  于 2023-10-21  发布在  Ruby
关注(0)|答案(1)|浏览(106)

这个应用程序有用户的结构有许多组织通过会员资格.

class User < ApplicationRecord
    has_many :memberships, dependent: :destroy
    has_many :organizations, through: :memberships
....
end

class Membership < ApplicationRecord
    belongs_to :organization, touch: true
    belongs_to :user, counter_cache: true
..
end

class Organization < ApplicationRecord
  has_many :memberships, dependent: :destroy
  has_many :members, through: :memberships, source: :user
...
end

Organization可以被owners销毁,memberships上的属性,从那里回调将负责销毁关联。
before_actions检查user/organizations关联是否存在。因此,当用户点击一个包含已删除organization的url时,他们将被重定向。但这似乎是错误的。
我的问题是,当current_user将遵循控制器操作重定向。其他用户应如何处理?他们应该点击before_actions,让那些重定向来处理它吗?一个after_destroy回调可以处理这个问题吗?这似乎打破了MVC模式tho,然后你必须处理,如果用户是“上”的organization或其他。
地狱已经讨论过了,这有一个名字,我不知道。
非常感谢。
编辑:控制器检查:

class Organizations::BaseController < ApplicationController
  before_action :restrict_user_by_role

  protected

  def restrict_user_by_role
    if organization_set?
      if !member?
        flash[:warning] = t("restricted_roles")
        redirect_to redirect_path
      elsif !current_membership.can_view_organization?
        flash[:warning] = t("restricted_roles")
        redirect_to redirect_path
      end
    else
      id = params[:parm_passed]
      unless Membership.current_member_check(id).exists?
        flash[:warning] = t("restricted_roles")
        refresh_or_redirect_to redirect_path
        return
      else
        organization = Organization.find_by(id: id)
        set_organization(organization)
        @organization = current_organization
      end
    end
  end
end

organization_set?current_membershipmember?都是在每个请求中设置的关注点,而can_view_program?Membership.current_member_check(id).exists?是对模型记录的授权检查。
这只是一些检查,但使用的基本思想。

jv4diomz

jv4diomz1#

看起来你的restrict_user_by_role做了一些事情(非SRP)。它应该只检查授权规则,如果失败则重定向。它不应该设置示例变量。如果before filter重定向到某处,则不执行main action
为了简化你的代码,做三个检查:当前用户的存在、当前组织的存在、当前用户对当前组织的所有权。如果其中一个条件为假-重定向用户

def restrict_user_by_role
  if current_user.nil? || current_organization.nil? || !current_organization.owners.include?(current_user)
    flash[:warning] = t("restricted_roles")
    redirect_to redirect_path
  end
end

相关问题