我有一个模型Post
,由不同的User
提交并评分。提交者和评分者由submitter_id
模型中的grader_id
和Post
标识。请注意,用户既是提交者本人又是其他人的评分者。
我想确保提交者只能编辑Post
的内容,而不能编辑成绩。同样,评分者只能编辑成绩而不能编辑内容。
多种编辑方法可行吗?我该怎么办呢?
答案 0 :(得分:1)
您可以在users
表中添加角色列,角色可以是submitter
或grader
。不确定您使用的是什么进行身份验证,但是如果您使用的是设计,则可以使用current_user
帮助程序访问当前登录的用户(如果您使用其他内容,请查看此部分,或添加新的助手)。
现在,在您的更新方法中,您可以执行以下操作:
# Controller
# scope post to current user, so that a user cannot edit someone else's post. A crude way to achieve this is post = Post.find(params[:id])
post = current_user.posts.find(params[:id])
post.content = params[:content] if post.submitter?(current_user.id)
post.grade = params[:grade] if post.grader?(current_user.id)
post.save!
# Model - Post.rb
def submitter?(user_id)
self.submitter_id == user_id
end
def grader?(user_id)
self.grader_id == user_id
end
将这些方法保留在模型中的优点是,如果您更改了权限逻辑(谁是提交者或分级者),则需要在单个位置更改它。 DRY。
您可以修改上述方法以显示错误消息,并执行其他类似操作。如果您正在寻找更精细的授权控制,您可以查看cancan gem:
答案 1 :(得分:0)
您的帖子模型应该只关注持久数据。最好使用普通的旧ruby对象来封装分级和提交的高阶行为。考虑使用服务对象或表单对象。
然后,每个服务或表单对象都可以包含ActiveModel :: Model(rails> v4)以获得自己的验证。
在此处查看有关服务和表单对象的更多信息:http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/
如果您只有一个提交操作和一个成绩操作,则可以将其保留在一个控制器中。但是,如果您开始有多个与提交相关的操作,以及与评分相关的多个操作,这听起来就像是他们自己创建了很好的资源控制器。