代码之家  ›  专栏  ›  技术社区  ›  Will

使用Rails 3引擎是否中断默认路线?

  •  3
  • Will  · 技术社区  · 14 年前

    我有一个Rails3引擎gem,用于基本用户身份验证和授权。在那颗宝石里 config/routes.rb 定义以下内容

    resources :users
    match '/:controller(/:action(/:id))'
    

    当我做 rake routes 从需要这个gem的应用程序中,我得到了以下路径

    rake routes|grep users
    users GET   /users(.:format)               {:controller=>"users", :action=>"index"}
    users POST  /users(.:format)               {:controller=>"users", :action=>"create"}
    new_user GET  /users/new(.:format)         {:controller=>"users", :action=>"new"}
    edit_user GET  /users/:id/edit(.:format)   {:controller=>"users", :action=>"edit"}
    user GET   /users/:id(.:format)            {:controller=>"users", :action=>"show"}
    user PUT   /users/:id(.:format)            {:controller=>"users", :action=>"update"}
    user DELETE /users/:id(.:format)           {:controller=>"users", :action=>"destroy"}
    

    这就是我所期望的。

    但是,当我试图通过浏览器访问以下路由时

    /users/137
    /users/137/edit
    

    日志中出现以下错误

    AbstractController::ActionNotFound (The action '137' could not be found for UsersController):
      actionpack (3.0.0) lib/abstract_controller/base.rb:114:in `process'
      actionpack (3.0.0) lib/abstract_controller/rendering.rb:40:in `process'
      ...
    

    有趣的是以下路径确实有效

    /users/show/137
    /users/edit/137
    

    另外,如果我将以下内容添加到需要gem的应用程序中的routes.rb文件中,那么它们都将按预期工作。

    resources :users
    

    我有什么东西不见了还是这是个虫子?

    请注意,在启动应用程序时,我也在执行以下操作 在命令行上,当我启动Rails时,我设置了以下env变量

    RAILS_RELATIVE_URL_ROOT="/my_app"
    

    在config.ru中

    map '/my_app' do
      run MSEL::Application
    end
    
    2 回复  |  直到 13 年前
        1
  •  2
  •   johnmcaliley    14 年前

    我在一块宝石上也经历了同样的事情。引擎路径是在应用程序路径之后加载的,我认为这可能是您的问题。看一看 rake routes 不为用户显示grepping。我怀疑您的应用程序中有一个优先于用户路由的路由。如果你有 match '/:controller(/:action(/:id))' 在应用程序路由中,这将优先于gem用户路由。可以解释为什么/users/show/137有效,而不是RESTful路由。可以在引擎初始值设定项中加载路由,以优先于应用程序路由。张贴你的全部 耙路 结果可能会帮助我们找到解决方案。

        2
  •  0
  •   Manish Shrivastava    13 年前

    对于我在3.1轨道

    root :to => 'ControllerName#Action'

    工作正常。