rails 3如何为特定任务(如故障单,消息)授予用户权限?

时间:2013-04-14 06:44:56

标签: ruby-on-rails-3

我是rails的新手,我希望为不同模块的项目中涉及的特定任务的用户授予权限。

我在“user.rb”has_many:projects中有两个模型“user”和“project”.... 并在“project.rb”belongs_to:user中。我还有一个模型,它将这个名为“user_project.rb”的模型组合在一起,并在proj_id中存储了一个user_id。

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

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

1 个答案:

答案 0 :(得分:0)

如果您仅为存储这些ID而创建了user_project.rb - 请将其删除。

看起来您需要在控制器中编写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

如果要创建模型消息(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

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