Rails总是路由一个动作来显示动作,它自己的动作变成了id

时间:2012-06-14 06:53:53

标签: ruby-on-rails ruby

我最近发现的与路由和操作相关的rails中有一个奇怪的行为,具体来说,它位于 rails 2.3.5 上。我有一个控制器,让我们称之为用户。在路由中,我将Users声明为资源。

map.resources :users

在控制器中,我有标准操作:index, show, edit, update & destroy。此外,我添加了其他操作以满足某些要求。

def generated_pdf_report
    # do something
end

问题是,当我转到页面/users/generated_pdf_report时,我在控制台上看到了这个:

Processing UsersController#show (some timestamps) [GET]
  Parameters: {"action"=>"show", "id"=>"generated_pdf_report", "controller"=>"users"}

如您所见,服务器将请求路由到方法show而不是方法generated_pdf_report 有趣的是 ,就是我有其他控制器具有类似的操作并且工作正常。

上述问题的解决方案很简单,请确保添加的Feed高于资源:

map.feed 'users/generated_pdf_report', :controller => 'users', :action => 'generated_pdf_report'
map.resources :users

我的问题是 :任何人都知道为什么rails会像那样?上面的解决方案有点草率,你认为这个问题的最佳实践如上所述。

2 个答案:

答案 0 :(得分:0)

如Rails 2 routing guide中所述,您可以像这样添加收集路线:

map.resources :users, :collection => { :generated_pdf_report => :get }

答案 1 :(得分:0)

当rails查看

/users/generate_report

这正是它用来显示id为generate_report的用户的路径,这就是它的作用,假设你没有告诉它。

您所写内容的缩写替代

resources :users, :collection => {:generate_report => :get}

告诉rails将GET映射到/ users / generate_report到你的generate_report动作