我有Users
很多People
很多Projects
。
例如,可以这样创建一个新项目:
def new
@project = Project.new(:person_id => params[:person_id])
@title = "New project"
end
如何确保用户只能在person_id
此处插入真正属于他的内容?
我有Users
很多People
很多Projects
。
例如,可以这样创建一个新项目:
def new
@project = Project.new(:person_id => params[:person_id])
@title = "New project"
end
如何确保用户只能在person_id
此处插入真正属于他的内容?
从会话(服务器端)获取 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
考虑为此使用隐式授权。您的最终结果应如下所示:
# 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 变量。每个控制器操作都应负责共享资源或资源集合。