2

我是 Rails 的新手,我想授予用户在不同模块上参与我的项目的特定任务的权限。

我有两个模型“user”和“project”......在“user.rb”has_many:项目和“project.rb”belongs_to:user。我还有一个模型,它结合了这个模型中名为“user_project.rb”的两个模型,其中存储了 proj_id 和 user_id。

我想授予权限,然后还要检查当前用户是否有权根据分配给他们的权限创建消息和任务。

我在哪里可以定义权限以及它在视图中对我的工作方式......

4

1 回答 1

0

如果您创建 user_project.rb 仅用于存储这些 id - 将其删除。

看起来您需要在控制器中编写 before_filter

class ProjectsController << ApplicationController
  before_filter :current_user_required, only: [ :edit, :update ]

  #there def of actions

  private 

  def current_user_required
    unless current_user == @project.user
      flash[:error] = 'error 403'
      redirect_to :back
    end
  end

当您找到 @project 时,对于编辑和更新操作,您可以这样做:

@project = current_user.projects.find(params[:project_id]) #need to change :project_id

如果您想创建模型 Message(belongs_to :project 和 Project has_name: messages) 并只为 project.user 授予创建和编辑权限,您可以使用 before_filter 或模型中的验证来完成

class Message << ActiveRecord::Base
  validate :author_is_project_user, on: :create

  private

  def author_is_project_user
    errors.add :base, 'author not is project user' unless self.author == self.project.user
  end
end

据此,您可以定义其他事物的权限

如果你想获得另一个用户的许可,你必须创建属于 :user 和 :project 的模型并检查 before_filter 的存在。

这样的:

class Permission << ActiveRecord::Base
  belongs_to :user
  belongs_to :project

  scope :about, -> project { where project_id: project }
  scope :of_user, -> user { where project_id: project }
end

并在用户模型中定义方法,如

def access_to_project? project
  Permission.about(project).of_user(self).first.present?
end

或者您可以向此模型添加变量并制作更复杂的访问逻辑

于 2013-04-14T11:05:52.777 回答