这是未经测试的,但我相信这是您正在寻找的:
路线:
resources :projects do
member do
post :set_current
end
end
这应该创建以下内容:
- 端点:/projects/:id/set_current POST
- 助手:set_current_project_path
控制器
def set_current
project = Project.find(params[:id])
session[:project_id] = project.id
redirect_to projects_path, :notice => "Current project set to #{project.name}"
end
意见
# index / erb tags excluded for simplicity
@projects.each do |project|
link_to 'Select Project', set_current_project_path(project), :method => :post
end
# show
<%= link_to 'Select Project', set_current_project_path(@project), :method => :post %>
看:
还要注意使用“post”而不是“get”,因为我们正在更改对象(会话)的状态,所以最好使用 post 而不是 get,否则用户可能会在地址栏中拉出旧的 get 请求他们的浏览器并在不知不觉中将他们的会话设置为一个项目。
就像varatis
说的那样 - 使用rake routes
orCONTROLLER=projects rake routes
来帮助确定您的路由/路径助手的外观以及他们期望的 http 动词
控制器中的项目不是@project有什么原因吗
@project 创建一个实例变量;在 Rails 控制器中,实例变量可用于视图。这个 set_current 动作永远不会渲染一个视图,所以没有理由用它来创建一个实例变量。
您为什么必须将其设置为成员而不是路由中的集合
您要引用的任何操作都params[:id]
应该是成员路由,另一种方法是将其保留为集合路由并params[:project_id]
在所有 link_to 调用中传递并传递它,但在这种情况下,成员更有意义。
我相信resources :projects
这是解决这个问题的捷径
member do
get :show
get :edit
put :update
delete :destroy
end
collection do
get :index
get :new
post :create
end
希望这能澄清你的一些问题?