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

时间:2012-10-14 22:35:11

标签: ruby-on-rails ruby ruby-on-rails-3

我的Users People有很多Projects def new @project = Project.new(:person_id => params[:person_id]) @title = "New project" end

例如,可以像这样创建一个新项目:

person_id

如何确保用户只能在此处插入真正属于他的{{1}}?

2 个答案:

答案 0 :(得分:1)

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

def new
  @project = Project.new(:person_id => session[:current_user_id])
end

或者,使界面更受限制:

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 

答案 1 :(得分:1)

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

# 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

然后在routes.rb

resources :people do
  resources :projects
end

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

在旁注中,您应该考虑使用Devise或before_filter之类的内容,这样您就可以更方便地访问当前用户,而无需在每个操作中执行User.find

此外,您的控制器操作中不应该有额外的@title变量。每个控制器操作都应负责共享资源或资源集合。