我有一个Subscriber
接受“ phone_number”和“ visit”整数的模型。我有两个控制器Subscribers
,Visits
(超级和子控制器)我以前从未使用过嵌套控制器,并且我相信名称空间存在一些问题。因为我找回了未初始化的常量错误。基本上,订户控制器签约一个订户,而访问控制器则通过用户输入他们的phone_number来计数他们已被访问的次数。为什么会出现此错误?为了清楚起见,我将显示我的代码。
控制器
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
路线
Rails.application.routes.draw do
devise_for :users
resources :subscribers, except: :show
get '/subscribers/visits/new', to: 'subscribers/visits#new'
root "welcomes#index"
意见
<h1>hey</hey>
<%= form_for @subscriber do |form| %>
<div class="form-group">
<p>
<%= form.label :phone_number %>
<%= form.text_field :phone_number %>
</p>
<% end %>
错误
您可能不需要从另一个继承一个控制器。只需像通常那样定义控制器即可:
app / controllers / subscribers_controller.rb
class SubscribersController < ApplicationController
# methods for Subscribers
end
在app / controllers / visits_controller.rb中
class VisitsController < ApplicationController
# methods for Visits
end
请注意,这些文件必须位于单独的文件中,以便Rails可以根据要查找的对象的名称找到正确的源文件。这是Rails的命名约定。
关于您的路线,您需要更改为使用4种路线格式之一。阅读“从外部进入Rails的路由”指南中有关添加更多RESTful操作的部分可能会有所帮助。
1)要将其visits
作为嵌套资源进行路由,这实际上就是您要尝试执行的操作,请使用以下命令:
resources :subscribers, except: :show do
resources :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
这是嵌套资源和单独控制器的典型路由结构。
2)要visits#new
在VisitsController中进行简单的集合(非成员)操作,则可能需要这样做:
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/visits/new
POST /subscribers/visits
这通常用于在现有资源和控制器中添加新的顶级路由。
3)要构造visits
为成员动作,请使用以下命令:
resources :subscribers, except: :show do
member 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
这通常用于在现有资源和控制器中添加新的成员路由。
4)要简单地使visits
路由似乎包含在中subscribers
,您可以使用以下方法:
get '/subscribers/visits/new', to: 'visits#new'
post '/subscribers/visits', to: 'visits#create'
resources :subscribers, except: :show
这将产生以下路线:
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
当它们实际上可能是独立的时,这可以用于使任意路由似乎包含在现有资源中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句