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我更新了答案,并为您可能使用的不同路线添加了一些选项和说明。在重新阅读您的问题时,您真正的意思是想要嵌套的路由,而不是嵌套的控制器,所以这个答案包括如何做到这一点。