Rails - 控制器中的自定义操作 - 如何在视图中引用?

时间:2012-06-30 16:25:15

标签: ruby-on-rails session link-to

我正在使用自定义操作将项目的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

2 个答案:

答案 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

这应该创建以下内容:

  • 端点:/ projects /:id / set_current POST
  • Helper: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',因为我们正在改变对象的状态(session) 最好使用post而不是get,否则用户可能会在地址栏中提取旧的get请求 他们的浏览器并在不知不觉中将会话设置为项目。

就像varatis所说 - 使用rake routesCONTROLLER=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

希望能澄清一些问题吗?