这个应用程序有用户的结构有许多组织通过会员资格.
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_membership
member?
都是在每个请求中设置的关注点,而can_view_program?
,Membership.current_member_check(id).exists?
是对模型记录的授权检查。
这只是一些检查,但使用的基本思想。
1条答案
按热度按时间jv4diomz1#
看起来你的
restrict_user_by_role
做了一些事情(非SRP)。它应该只检查授权规则,如果失败则重定向。它不应该设置示例变量。如果before filter重定向到某处,则不执行main action为了简化你的代码,做三个检查:当前用户的存在、当前组织的存在、当前用户对当前组织的所有权。如果其中一个条件为假-重定向用户