Rails 3 - 在控制器上默认不加载索引操作

时间:2011-04-26 17:33:58

标签: ruby-on-rails-3 routes

现在我在rails 3上运行了新的rvm 1.9.2安装 我使用以下指令生成了一个控制器:

rails generate controller blog index

输出

      create  app/controllers/blog_controller.rb
      route  get "blog/index"
      invoke  erb
      create    app/views/blog
      create    app/views/blog/index.html.erb
      invoke  test_unit
      create    test/functional/blog_controller_test.rb
      invoke  helper
      create    app/helpers/blog_helper.rb
      invoke    test_unit
      create      test/unit/helpers/blog_helper_test.rb

但在浏览器中,当我尝试前往http://localhost:3000/blog时,我得到:

No route matches "/blog"

但如果我输入http://localhost:3000/blog/index

它呈现索引视图。

它不像Rails 2那样有效吗?默认情况下,只需将控制器名称放在URL上,我就进入索引视图?

感谢。

6 个答案:

答案 0 :(得分:10)

如果您查看routes.rb,您会看到

get "/blog/index" => "blog#index"

所以只需用

删除它
get "/blog" => "blog#index"

或者你可以在这里使用resources

但唯一的问题是:你为什么使用单数形式?将index称为singular名词是没有意义的。您应该使用或“blog#show”作为资源或“blogs #index”作为资源。

Rails中的约定是一种地下室。如果你能跟着他们,不要打破他们

答案 1 :(得分:4)

默认情况下,Rails generate不会为您的控制器生成资源。您为控制器指定了一个操作'index',因此在您的情况下,您最终会在config / routes.rb中执行此操作:

Blog::Application.routes.draw do
    get "blog/index"

最简单的方法是将其更改为:

  get "blog", :to => 'blog#index'

伊恩。

答案 2 :(得分:4)

对于rails 3:

match '/blog', :controller => 'blog', :action => 'index'

答案 3 :(得分:2)

这是一个猜测,基于我对Rails 2的经验,但这是我认为正在发生的事情:

如果您使用scaffold选项生成控制器(仍然在Rails 3中,对吗?),除了您的控制器之外,它还会创建一个模型,并通过调用添加相应的路由map.resources(或等效的Rails 3) - 最后一位是为您提供所期望的/models路由。

但是因为你刚刚生成了控制器,所以没有创建模型,因此Rails没有在routes.rb中放入map.resources语句 - map.resources真的只有当有一个模型底层时才有意义你的控制器。实际上,在生成控制器时,我认为它不会添加任何特殊路由;您将通过其中一条默认路线到达您的索引:/:controller/:action

因此,如果您想从/blog获取索引,则必须自行添加路线。幸运的是,它应该是一个单行。

希望这有帮助!

PS:如果你是偏执狂,你会想要在开始制作之前禁用这些默认路线 - 它们允许GET请求触发改变数据库的动作(例如GET:/blog/destroy),打开你Cross-Site Request Forgery攻击。

答案 4 :(得分:1)

将此添加到routes.rb文件match ':controller(/:action(/:id))(.:format)'
如果你将它添加到routes.rb文件的底部,那就更好了 这种方法的问题在于它会通过get请求使您的所有操作都可用。所以要小心。

答案 5 :(得分:0)

您可以转到/app/controllers/application_controller.rb并添加空白索引方法

,而不是手动路由
def index
end

确保您生成的控制器扩展了应用程序控制器,并且 boom 所有生成的控制器都可以执行您想要的操作 测试Rails 3.2。*