1

我最近发现 Rails 中有一个奇怪的行为与路线和动作有关,特别是在rails 2.3.5上。我有一个控制器,我们称之为用户。在路线中,我将用户声明为资源。

map.resources :users

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

def generated_pdf_report
    # do something
end

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

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

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

上述问题的解决方案很简单,确保添加的提要在资源之上:

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

我的问题是:任何人都知道为什么 rails 会这样吗?上述解决方案有点草率,您认为针对上述问题的最佳实践是什么。

4

2 回答 2

0

正如 Rails 2路由指南中所述,您可以像这样添加集合路由:

map.resources :users, :collection => { :generated_pdf_report => :get }
于 2012-06-14T07:20:04.920 回答
0

当rails看着

/users/generate_report

这正是它用来显示 id 为 generate_report 的用户的路径,所以它就是这样做的,假设你没有另外告诉它。

你写的更短的替代方法是

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

它告诉 Rails 将 GET 映射到 /users/generate_report 到您的 generate_report 操作

于 2012-06-14T07:25:20.393 回答