如果您创建 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
或者您可以向此模型添加变量并制作更复杂的访问逻辑