Ruby on rails rails的路由错误-未初始化的常量控制器

Ruby on rails rails的路由错误-未初始化的常量控制器,ruby-on-rails,ruby,routing,Ruby On Rails,Ruby,Routing,我有一个订户模型,它接受一个“电话号码”和一个“访问”整数。我有两个控制器订阅者和访问(super和sub)。我以前从未使用过嵌套控制器,我认为我的命名空间有一些问题。因为我得到了未初始化的常量错误。基本上,订户控制器注册订户,访问控制器通过用户输入他们的电话号码统计他们访问的次数。为什么我会犯这个错误?为了清晰起见,我将显示我的代码 控制器 class Subscribers::VisitsController < ApplicationController def new

我有一个
订户
模型,它接受一个“电话号码”和一个“访问”整数。我有两个控制器
订阅者
访问
(super和sub)。我以前从未使用过嵌套控制器,我认为我的命名空间有一些问题。因为我得到了未初始化的常量错误。基本上,订户控制器注册订户,访问控制器通过用户输入他们的电话号码统计他们访问的次数。为什么我会犯这个错误?为了清晰起见,我将显示我的代码

控制器

  class Subscribers::VisitsController < ApplicationController
   def new
    @subscriber = Subscriber.new
   end

   def create
    @subscriber = Subscriber.find_by_phone_number(params[:phone_number])
    if @subscriber
     @subscriber.visit += 1
     @subscriber.save
     redirect_to subscribers_visits_new_path(:subscriber)
    else
    render "new"
    end
   end
 end


   class SubscribersController < ApplicationController
 def index
  @subscriber = Subscriber.all
 end

 def new
  @subscriber = Subscriber.new
 end

 def create
  @subscriber = Subscriber.create(subscriber_params)
  if @subscriber.save
    flash[:success] = "Subscriber Has Been successfully Created"
    redirect_to new_subscriber_path(:subscriber)
  else
    render "new"
  end
 end
观点

错误


您可能不需要从一个控制器继承另一个控制器。只需按照通常的方式定义控制器:

app/controllers/subscribers\u controller.rb

class SubscribersController < ApplicationController
  # methods for Subscribers
end
class VisitsController < ApplicationController
  # methods for Visits
end
这将产生以下路线:

GET    /subscribers/new
POST   /subscribers
GET    /subscribers
GET    /subscribers/:id/edit
PATCH  /subscribers/:id/update
DELETE /subscribers/:id/destroy
GET    /subscribers/:id/visits/new
POST   /subscribers/:id/visits
GET    /subscribers/:id/visits
GET    /subscribers/:id/visits/:id
GET    /subscribers/:id/visits/:id/edit
PATCH  /subscribers/:id/visits/:id/update
DELETE /subscribers/:id/visits/:id/destroy
GET    /subscribers/new
POST   /subscribers
GET    /subscribers
GET    /subscribers/:id/edit
PATCH  /subscribers/:id/update
DELETE /subscribers/:id/destroy
GET    /subscribers/visits/new
POST   /subscribers/visits
GET    /subscribers/new
POST   /subscribers
GET    /subscribers
GET    /subscribers/:id/edit
PATCH  /subscribers/:id/update
DELETE /subscribers/:id/destroy
GET    /subscribers/:id/visits/new
POST   /subscribers/:id/visits
GET    /subscribers/visits/new
POST   /subscribers/visits
GET    /subscribers/new
POST   /subscribers
GET    /subscribers
GET    /subscribers/:id/edit
PATCH  /subscribers/:id/update
DELETE /subscribers/:id/destroy
这是嵌套资源和独立控制器的典型路由结构

2)要在VisitController中进行
访问#新建
一个简单的集合(非成员)操作,您可能需要:

resources :subscribers, except: :show do
  collection do
    get 'visits/new', to 'visits#new'
    post 'visits', to 'visits#create'
  end
end
这将产生以下路线:

GET    /subscribers/new
POST   /subscribers
GET    /subscribers
GET    /subscribers/:id/edit
PATCH  /subscribers/:id/update
DELETE /subscribers/:id/destroy
GET    /subscribers/:id/visits/new
POST   /subscribers/:id/visits
GET    /subscribers/:id/visits
GET    /subscribers/:id/visits/:id
GET    /subscribers/:id/visits/:id/edit
PATCH  /subscribers/:id/visits/:id/update
DELETE /subscribers/:id/visits/:id/destroy
GET    /subscribers/new
POST   /subscribers
GET    /subscribers
GET    /subscribers/:id/edit
PATCH  /subscribers/:id/update
DELETE /subscribers/:id/destroy
GET    /subscribers/visits/new
POST   /subscribers/visits
GET    /subscribers/new
POST   /subscribers
GET    /subscribers
GET    /subscribers/:id/edit
PATCH  /subscribers/:id/update
DELETE /subscribers/:id/destroy
GET    /subscribers/:id/visits/new
POST   /subscribers/:id/visits
GET    /subscribers/visits/new
POST   /subscribers/visits
GET    /subscribers/new
POST   /subscribers
GET    /subscribers
GET    /subscribers/:id/edit
PATCH  /subscribers/:id/update
DELETE /subscribers/:id/destroy
这通常用于在现有资源和控制器中添加新的顶级路由

3)要将
访问构建为成员操作,请使用以下命令:

resources :subscribers, except: :show do
  resources :visits
end
resources :subscribers, except: :show do
  member do
    get 'visits/new', to 'visits#new'
    post 'visits', to 'visits#create'
  end
end
get '/subscribers/visits/new', to: 'visits#new'
post '/subscribers/visits', to: 'visits#create'
resources :subscribers, except: :show
这将产生以下路线:

GET    /subscribers/new
POST   /subscribers
GET    /subscribers
GET    /subscribers/:id/edit
PATCH  /subscribers/:id/update
DELETE /subscribers/:id/destroy
GET    /subscribers/:id/visits/new
POST   /subscribers/:id/visits
GET    /subscribers/:id/visits
GET    /subscribers/:id/visits/:id
GET    /subscribers/:id/visits/:id/edit
PATCH  /subscribers/:id/visits/:id/update
DELETE /subscribers/:id/visits/:id/destroy
GET    /subscribers/new
POST   /subscribers
GET    /subscribers
GET    /subscribers/:id/edit
PATCH  /subscribers/:id/update
DELETE /subscribers/:id/destroy
GET    /subscribers/visits/new
POST   /subscribers/visits
GET    /subscribers/new
POST   /subscribers
GET    /subscribers
GET    /subscribers/:id/edit
PATCH  /subscribers/:id/update
DELETE /subscribers/:id/destroy
GET    /subscribers/:id/visits/new
POST   /subscribers/:id/visits
GET    /subscribers/visits/new
POST   /subscribers/visits
GET    /subscribers/new
POST   /subscribers
GET    /subscribers
GET    /subscribers/:id/edit
PATCH  /subscribers/:id/update
DELETE /subscribers/:id/destroy
这通常用于在现有资源和控制器中添加新成员路由

4)要简单地使
访问
路线显示为包含在
订户
中,您可以使用以下方法:

resources :subscribers, except: :show do
  resources :visits
end
resources :subscribers, except: :show do
  member do
    get 'visits/new', to 'visits#new'
    post 'visits', to 'visits#create'
  end
end
get '/subscribers/visits/new', to: 'visits#new'
post '/subscribers/visits', to: 'visits#create'
resources :subscribers, except: :show
这将产生以下路线:

GET    /subscribers/new
POST   /subscribers
GET    /subscribers
GET    /subscribers/:id/edit
PATCH  /subscribers/:id/update
DELETE /subscribers/:id/destroy
GET    /subscribers/:id/visits/new
POST   /subscribers/:id/visits
GET    /subscribers/:id/visits
GET    /subscribers/:id/visits/:id
GET    /subscribers/:id/visits/:id/edit
PATCH  /subscribers/:id/visits/:id/update
DELETE /subscribers/:id/visits/:id/destroy
GET    /subscribers/new
POST   /subscribers
GET    /subscribers
GET    /subscribers/:id/edit
PATCH  /subscribers/:id/update
DELETE /subscribers/:id/destroy
GET    /subscribers/visits/new
POST   /subscribers/visits
GET    /subscribers/new
POST   /subscribers
GET    /subscribers
GET    /subscribers/:id/edit
PATCH  /subscribers/:id/update
DELETE /subscribers/:id/destroy
GET    /subscribers/:id/visits/new
POST   /subscribers/:id/visits
GET    /subscribers/visits/new
POST   /subscribers/visits
GET    /subscribers/new
POST   /subscribers
GET    /subscribers
GET    /subscribers/:id/edit
PATCH  /subscribers/:id/update
DELETE /subscribers/:id/destroy

这可能用于使任意路由看起来包含在现有资源中,而实际上它们可能是独立的。

Hmm,我猜您正在尝试将url
订户/访问/new
路由到
visitscoller
中的
新建
操作。更改此行如何:

get '/subscribers/visits/new', to: 'subscribers/visits#new'
致:

如果仍然出现错误,请尝试将此块移到
resources:subscribers上方,但::show
除外


干杯

您能为这两个控制器粘贴
路线.rb
吗?为您设置了这些路线访问控制器的目的是什么?你不能在订阅者控制器中执行一个访问操作,然后有一个到订阅者的路径#访问
并更新那里的访问字段吗?请提供完整日志,包括错误的回溯。您可以在Rails控制台或
log/development.log
中找到失败的操作。将所有内容从操作的
开始
行复制到
完成
行(或日志末尾)非常重要。仍然会收到错误。谢谢你的帮助though@CameronBass我更新了答案,并为您可能使用的不同路线添加了一些选项和说明。在重新阅读您的问题时,您真正的意思是想要嵌套的路由,而不是嵌套的控制器,所以这个答案包括如何做到这一点。