rails 3中没有模型的控制器的路由

Posted

技术标签:

【中文标题】rails 3中没有模型的控制器的路由【英文标题】:Route for a controller without model in rails 3 【发布时间】:2012-10-01 21:26:44 【问题描述】:

我有一个名为 BaseController 的控制器,它从 ApplicationController 继承,但没有关联模型,但它有 ping 方法,该方法只响应一条消息以通知一切正常。

我正在尝试通过 BaseController 在我的 routes.rb 文件中设置它来调用操作 ping:

namespace :api, defaults:  format: 'json'  do   
  match '/ping' => 'base#ping' 
end

但它总是给我一个 NameError uninitialized constant Base。我想它试图找到一个不存在的名为 Base 的模型,所以我不知道如何设置到我的控制器的正确路由。

我的 BaseController 的内容如下:

class Api::BaseController < ApplicationController
   load_and_authorize_resource
   respond_to :json

   def ping
      respond_with( :status => 'OK' )
   end
end

作为额外信息:BaseController 只是其他控制器继承的父控制器。其他的是足智多谋的控制器,并有相关的模型

谢谢。

【问题讨论】:

【参考方案1】:

在你的 routes.rb 中试试这个 map.resources :base, :collection=> :ping=>:get

【讨论】:

【参考方案2】:

当您在路由周围放置命名空间时,它会在该命名空间中查找控制器。

因此,在您的情况下,它将寻找一个名为 Api::BaseController 的控制器,该控制器通常存储在 app/controllers/api/base_controller.rb 中。你的控制器是这样设置的吗?

更多详情请看这里:http://guides.rubyonrails.org/routing.html#controller-namespaces-and-routing

编辑:

我认为问题不是找不到控制器。由于您在控制器中调用load_and_authorize_resource,因此导致错误。 CanCan 使用控制器名称来尝试加载资源。

如果控制器没有型号,请拨打authorize_resource :class =&gt; false

有关详细信息,请参阅bottom of this page。

【讨论】:

您可以将BaseController 的内容添加到问题中吗? 感谢您的关注。已添加 BaseController 内容。 更新了答案,我认为这是由于您使用 CanCan 的方式。 非常感谢,这正是问题所在。 不用担心,这表明在您的问题中提供尽可能多的信息总是好的。 :D 随意选择这个作为答案【参考方案3】:

请试试这个:

在你的 routes.rb 中添加这个

resources :base

【讨论】:

谢谢,但仍然是 NameError,但我没有基本模型,只是 api 的特定控制器。从 BaseController 继承的控制器工作正常,但它们具有关联的模型。我的意思是,ping 路由不一定是资源丰富的路由。

以上是关于rails 3中没有模型的控制器的路由的主要内容,如果未能解决你的问题,请参考以下文章

动态 URL -> Rails 中路由的控制器映射

在另一个模型控制器中使用的 Rails 3 虚拟属性

在没有在模型中定义的情况下在 rails 中创建 slug

Rails自定义路由,如何删除?id =

Rails 3 路由如何匹配多个?

胖模型和瘦控制器听起来像是在创造上帝模型