我是rails的新手,我希望为不同模块的项目中涉及的特定任务的用户授予权限。
我在“user.rb”has_many:projects中有两个模型“user”和“project”.... 并在“project.rb”belongs_to:user中。我还有一个模型,它将这个名为“user_project.rb”的模型组合在一起,并在proj_id中存储了一个user_id。
我想授予权限,之后还要检查当前用户根据权限分配给他们创建消息和任务的权限。
我在哪里可以定义权限以及它在视图中的工作方式......
答案 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
或者您可以向此模型添加变量并制作更复杂的访问逻辑