Model
用来处理 permissions, roles, and policies 的工具,需要处理比如某 object 是否有执行某 action 的权限,虽然很多 gem 已经做了类似的事情,比如 pundit, Cancan, and Cancancan,也是用了这个 pattern,但是还是有很多特殊场景,需要手动创建 policy 来满足需求。
对 Music 有编辑权限的 3 种场景
app/policies/musics_edition_policy.rb
class MusicsEditionPolicy
attr_reader :event, :user, :music
def initialize(event, user, music)
@event = event
@user = user
@music = music
end
def edit?
event_host? || music_owner? || special_guest?
end
private
# implement your logic with each methods
def event_host? ;end
def music_owner? ;end
def special_guest? ;end
end
(why 适合用 policy objects 实现)
把大量的判断逻辑放到 view 里面,一方面会让 view 很 heavy,另一方面会让测试很麻烦,可以把一些 view 上面臃肿的逻辑放到 presenter 里面,仅对 presenter 写单元测试也更聚焦。presenter 是很好的后台 model 和前端 view 的一个桥梁。(decorator 有类似的效果,略有不同,这个链接不错哦 Presenter VS Decorator)
用户自己 login 的导航/对外 music 的封面/用户管理页面,显示不同的用户名字
app/presenters/user_presenter.rb
class UserPresenter < SimpleDelegator
def display_name
end
def official_name_for_music
end
def official_name_for_admin
end
end
(why 适合用 presenter pattern 实现)
总有一些判断 query 条件是在很多地方用到,api v2/graphql/normal controller etc,
查询所有 current_user 有权限编辑的音乐
app/queries/music_query.rb
class MusicQuery
attr_reader :user
def initialize(user:)
@user = user
end
def editable ;end
def active ;end
end
(why 适合用 query objects 实现)
模型需求纯属自编自演,如有雷同个纯属巧合。ENDING!!!