0

我正在使用自定义操作将项目的 id 获取到会话中,以便仅在其他区域中显示该项目的相关信息。我在项目控制器中进行了自定义操作,但无法在视图中获取链接以调用该操作。我只是收到一条错误消息“找不到没有 ID 的项目”。我是 Rails 新手 - 我知道这可能是一个简单的问题,但非常感谢您的帮助,谢谢!

查看代码:

<%= 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
4

2 回答 2

1

我认为生成的路线是select_project_projects_path.

关联:

<%= link_to 'Select Project', select_project_projects_path %>

为了将来参考,运行rake routes查看 Rails 生成的自动路由助手。

于 2012-06-30T17:03:33.823 回答
1

这是未经测试的,但我相信这是您正在寻找的:

路线:

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 routesorCONTROLLER=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

希望这能澄清你的一些问题?

于 2012-07-01T15:25:19.537 回答