【问题标题】:How do I create routes for a controller that does nothing with models in Rails?如何为在 Rails 中对模型不执行任何操作的控制器创建路由?
【发布时间】:2012-06-18 17:48:10
【问题描述】:

对 Rails 还是很陌生,所以如果我采取了完全错误的方法,请随时将我排除在外。

如何让 routes.rb 知道有一个根控制器充满了不操纵模型的动作,同时保留了路由辅助方法?我希望它响应以下请求:

http://localhost/download
http://localhost/share

使用类似的路线助手

download_app_path
share_path

但没有像这样的静态命名路由:

match '/download' => 'site#download', :as => :download_app
match '/share' => 'site#share', :as => :share

来自不从我的应用创建、显示或以其他方式操作模型的 SiteController。

我尝试过使用这样的方法,但它在不生成路由助手的情况下工作(自然)

match '/:action', :controller => 'site'

理论上我可以不使用路由助手,但我认为它们比将 url 选项的哈希传递给 link_to 或表单方法更容易阅读。

有没有办法完成一个更足智多谋的根控制器,或者我正在尝试为 Rails 做非常规的事情?

编辑

为了清楚起见,下面是这个 SiteController 类的样子:

class SiteController < ApplicationController
  def download
    @custom_options = { .. }
  end
  def share
    @custom_options = { .. }
  end
  def about
  end
end

它的目的是让我可以将不与资源(例如用户或友谊)交互的页面收集到一个控制器中,并将它们全部保存在一个地方。我正在尝试将此控制器设置为应用程序根控制器 - 因此来自此控制器的所有路径都将直接离开应用程序主机(myapp.com/download)

提前致谢!

【问题讨论】:

    标签: ruby-on-rails-3 routes


    【解决方案1】:

    路线和资源与模型无关。这只是一个 RESTful 约定。如果您只想使用索引操作,在您的示例中 downloadshare 可以像

    resouce :download, only: [:index]
    resouce :share, only: [:index]
    

    查看指南http://guides.rubyonrails.org/routing.html中的所有示例

    如果您想将下载和共享功能添加到某些“资源”,例如图片,那么您可以执行以下操作:

    resources :pictures do
      get 'download', :on => :member
      get 'share', :on => :member
    end
    

    例如,资源始终具有端点/pictures。因此,如果您想拥有直接到您的主机的路径,那么您需要在您的路由中提供自定义匹配器,就像您在示例中所做的那样。

    【讨论】:

    • 您似乎是在建议我从 SiteController.rb 中分离出“下载”和“共享”操作,并使它们成为各自不同控制器的索引操作,对吗?此外, :only 和 :except 选项似乎只适用于默认路由;当请求传入时,它们不会向 routes.rb 公开自定义操作“下载”或“共享”,这使我回到静态定义路由以获取所需路径。
    • 也许我只是不明白您要做什么...您想提供一些“资源”以供下载和共享吗?那么你可以采取不同的方法。
    • 不,没有与之交互或以其他方式提供的资源。看看我的编辑,希望能清楚地说明 SiteController 的角色是什么。
    猜你喜欢
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    相关资源
    最近更新 更多