Ruby on rails 如何确保用户只能编辑自己的条目?

Ruby on rails 如何确保用户只能编辑自己的条目?,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,我有用户,他们有许多人,他们有许多项目 例如,可以如下方式创建新项目: def new @project = Project.new(:person_id => params[:person_id]) @title = "New project" end 如何确保用户只能在此处插入真正属于他的个人id?从会话(服务器端)获取用户id,但不能从参数(客户端),例如 或者,使界面更加严格: def new @project = Project.create_for_current

我有
用户
,他们有许多
,他们有许多
项目

例如,可以如下方式创建新项目:

def new
  @project = Project.new(:person_id => params[:person_id])
  @title = "New project"
end
如何确保用户只能在此处插入真正属于他的
个人id

从会话(服务器端)获取用户id,但不能从参数(客户端),例如

或者,使界面更加严格:

def new
  @project = Project.create_for_current_user(session)
end

def Project.create_for_current_user(session)
  return Project.new(:person_id => session[:current_user_id])
end 

考虑对此使用隐式授权。您的最终结果应该如下所示:

# GET people/1/projects/new
def new
  user = User.find(session[:current_user_id])
  @project = user.people.find(params[:person_id]).projects.build(:title => "New Project")
end

# POST people/1/projects
def create
  user = User.find(session[:current_user_id])
  user.people.find(params[:person_id]).projects.create(params[...])
end
然后在:

通过这种方法,新项目将自动归属于用户

在一个旁注下,您应该考虑使用类似于Debug或Debug过滤器之类的东西,这样您就可以更方便地访问当前用户,而不必做“代码>用户”。 此外,在控制器操作中不应该有额外的@title变量。每个控制器操作都应负责共享资源或资源集合

# GET people/1/projects/new
def new
  user = User.find(session[:current_user_id])
  @project = user.people.find(params[:person_id]).projects.build(:title => "New Project")
end

# POST people/1/projects
def create
  user = User.find(session[:current_user_id])
  user.people.find(params[:person_id]).projects.create(params[...])
end
resources :people do
  resources :projects
end