【问题标题】:Routing error for rails - uninitialized constant SubscribersControllerrails 的路由错误 - 未初始化的常量 SubscribersController
【发布时间】:2016-05-29 23:21:54
【问题描述】:

我有一个Subscriber 模型,它接受一个“电话号码”和一个“访问”整数。我有两个控制器 SubscribersVisits(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

路线

  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 %>

错误

【问题讨论】:

  • 你可以为这两个控制器粘贴routes.rb吗?
  • 为您准备好这些路线
  • 访问控制器的目的是什么?难道你不能只在订阅者控制器中有一个访问操作,然后有一个到subscribers#visit 的路由并在那里更新访问字段吗?
  • 请提供完整的日志,包括错误的回溯。您可以在 Rails 控制台或 log/development.log 中找到失败的操作。将操作的 Started 行中的所有内容复制到 Completed 行(或日志末尾)很重要。

标签: ruby-on-rails ruby routing


【解决方案1】:

嗯,我猜你正在尝试将 url subscriber/visits/new 路由到 new VisitsController 中的操作?如何更改此行:

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

到:

namespace :subscribers do
  get '/visits/new', to: 'visits#new'
end

如果仍然出现错误,请尝试将此块移至 resources :subscribers, except: :show 上方。

干杯

【讨论】:

    【解决方案2】:

    您可能不需要从另一个控制器继承一个控制器。像往常一样简单地定义控制器:

    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 Routing from the Outside In 指南中关于Adding More RESTful Actions 的部分可能会有所帮助。

    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
    

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

    【讨论】:

    • 仍然出现错误。感谢您的帮助
    • @CameronBass 我更新了答案,并为您可能使用的不同路线添加了一些选项和描述。在重新阅读您的问题时,很明显您的真正意思是您想要嵌套 routes,而不是嵌套 controllers,所以这个答案包括如何做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 2012-05-04
    • 1970-01-01
    相关资源
    最近更新 更多