不同的用户可以使用不同的更新/编辑方法

时间:2014-08-25 20:35:38

标签: ruby-on-rails ruby-on-rails-4

我有一个模型Post,由不同的User提交并评分。提交者和评分者由submitter_id模型中的grader_idPost标识。请注意,用户既是提交者本人又是其他人的评分者。

我想确保提交者只能编辑Post的内容,而不能编辑成绩。同样,评分者只能编辑成绩而不能编辑内容。

多种编辑方法可行吗?我该怎么办呢?

2 个答案:

答案 0 :(得分:1)

您可以在users表中添加角色列,角色可以是submittergrader。不确定您使用的是什么进行身份验证,但是如果您使用的是设计,则可以使用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:

https://github.com/ryanb/cancan

答案 1 :(得分:0)

您的帖子模型应该只关注持久数据。最好使用普通的旧ruby对象来封装分级和提交的高阶行为。考虑使用服务对象或表单对象。

然后,每个服务或表单对象都可以包含ActiveModel :: Model(rails> v4)以获得自己的验证。

在此处查看有关服务和表单对象的更多信息:http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/

如果您只有一个提交操作和一个成绩操作,则可以将其保留在一个控制器中。但是,如果您开始有多个与提交相关的操作,以及与评分相关的多个操作,这听起来就像是他们自己创建了很好的资源控制器。