在Rails3中覆盖到/(root)的资源路由:不更改路径帮助器?

时间:2010-09-26 07:32:51

标签: ruby-on-rails ruby-on-rails-3 routes rails-routing

我是Rails3的新手,我基本上创建了一个subscribers脚手架,我只希望我的应用响应newcreate行为。

所以config/routes.rb我定义了:

resources :subscribers, :only => [:new, :create]

哪种方式有效

GET /subscribers => subscribers#new
POST /subscribers => subscribers#create

现在我希望我的应用在/(root)而不是/subscribers展示订阅者资源,所以这就是我所做的:

match '/' => "subscribers#new"
match '/' => "subscribers#create"
match '/' => "subscribers#thankyou"
resources :subscribers, :only => [:new, :create]

哪种方式有效,但可能不是最糟糕的事情:以下是我遇到的问题:

  1. 在创建问题后返回表单时,浏览器会显示/subscribers网址而不只是/,表单是使用form_for(@subscriber)辅助方法创建的,因此path帮助程序必须以某种方式不受路由影响
  2. 理想情况下,我甚至不希望该应用响应/subscribers
  3. 上的请求
  4. 我注意到一个奇怪的错误,当在断开连接时发布表单(来自/,然后在连接回来时进行刷新(浏览器要求重新提交=> OK),Rails应用程序崩溃(I没有错误堆栈,虽然这是生产),为什么会这样?
  5. 此外,我尝试以这种方式设置路线:

    resources :subscribers, :only => [:new, :create] do
      collection do
        post '/' => :create
        get '/' => :new
      end
    end
    

    哪个可能是DRYer,但它不能解决任何这些问题。

    我相信这很简单,请帮助!

3 个答案:

答案 0 :(得分:19)

感谢您的回答,它帮助我找到了问题的确切解决方案:

resources :subscribers, :only => [:new, :create], :path => '', :path_names => {:new => ''}

测试并使用Rails 3:)

答案 1 :(得分:3)

你可以做到

resources :subscribers, :path => ''

并确保您的根模板提供GET /,例如将其添加到SubscribersController:

  def index
    render 'welcome/index'
  end

我尝试使用match "/"声明覆盖资源索引操作并将其映射到另一个控制器,但显然resources声明始终完全覆盖手动声明的路由。

答案 2 :(得分:0)

对于列表中的数字2,删除此行,并在erb中重写任何_path或_url方法:

resources :subscribers, :only => [:new, :create]