我正在使用自定义操作将项目的ID添加到会话中,因此只有该项目的相关信息才会显示在其他区域中。我已经在项目控制器中进行了自定义操作,并且无法在视图中获取链接以调用该操作。我刚收到一条错误消息,说“无法找到没有ID的项目”。我是铁杆新手 - 我知道这可能是一个简单的问题,但是非常感谢帮助,谢谢!
查看代码:
<%= link_to 'Select Project', :action => :select_project %>
控制器代码:
def select_project
@project = Project.find(params[:id])
session[:project_id] = @project.id
end
路线:
resources :projects do
collection do
get :select_project
end
end
替代路线代码:
resources :projects do
put 'select_project', on: :member
end
答案 0 :(得分:1)
我认为生成的路线为select_project_projects_path
。
链接:
<%= link_to 'Select Project', select_project_projects_path %>
为了将来参考,请运行rake routes
以查看Rails生成的自动路由助手。
答案 1 :(得分:1)
这是未经测试的,但我相信这正是您所寻找的:
路线:
resources :projects do
member do
post :set_current
end
end
这应该创建以下内容:
控制器
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',因为我们正在改变对象的状态(session) 最好使用post而不是get,否则用户可能会在地址栏中提取旧的get请求 他们的浏览器并在不知不觉中将会话设置为项目。
就像varatis
所说 - 使用rake routes
或CONTROLLER=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
希望能澄清一些问题吗?