【问题标题】:ActionController::RoutingError (uninitialized constant Members) in Production Only仅生产中的 ActionController::RoutingError(未初始化的常量成员)
【发布时间】:2018-02-12 18:18:05
【问题描述】:

我已经阅读了很多张贴的不同问题,但找不到我的答案。似乎其他所有人在开发中都遇到了这个问题,这是由于命名问题。我在开发中一切正常,但在生产中出现错误。

网络应用信息:

导轨: 5.1.4

Ruby: 2.5.0p0(2017-12-25 修订版 61468)[x86_64-darwin17]

部署到: Heroku

收到错误:

2018-02-12T17:59:43.693569+00:00 heroku[router]: at=info method=GET path="/login" host=the-christian-chain.herokuapp.com request_id=9933c1eb-5023-4814-976d-a656053794d3 fwd="137.152.185.249" dyno=web.1 connect=1ms service=5ms status=404 bytes=1902 protocol=https
2018-02-12T17:59:43.690742+00:00 app[web.1]: I, [2018-02-12T17:59:43.690635 #4] INFO  -- : [9933c1eb-5023-4814-976d-a656053794d3] Started GET "/login" for 137.152.185.249 at 2018-02-12 17:59:43 +0000
2018-02-12T17:59:43.692591+00:00 app[web.1]: F, [2018-02-12T17:59:43.692522 #4] FATAL -- : [9933c1eb-5023-4814-976d-a656053794d3]   
2018-02-12T17:59:43.692655+00:00 app[web.1]: F, [2018-02-12T17:59:43.692591 #4] FATAL -- : [9933c1eb-5023-4814-976d-a656053794d3] ActionController::RoutingError (uninitialized constant Members):
2018-02-12T17:59:43.692715+00:00 app[web.1]: F, [2018-02-12T17:59:43.692656 #4] FATAL -- : [9933c1eb-5023-4814-976d-a656053794d3]   
2018-02-12T17:59:43.692815+00:00 app[web.1]: F, [2018-02-12T17:59:43.692738 #4] FATAL -- : [9933c1eb-5023-4814-976d-a656053794d3] vendor/bundle/ruby/2.5.0/gems/activesupport-5.1.4/lib/active_support/inflector/methods.rb:269:in `const_get'
....

然后它会列出一堆其他请求,直到主页的最终GET

我遇到了一个问题,即应用程序在部署到 Heroku 后会崩溃,并出现相同的 uninitialized constant Members 类型问题。因此,我将 eager_load 更改为 false,这似乎解决了这个问题。但是,现在看到这个,我想知道我的代码中是否存在更大的问题。

在此处将其更改为 false: config/environments/production.rb

....
# Eager load code on boot. This eager loads most of Rails and
# your application in memory, allowing both threaded web servers
# and those relying on copy on write to perform better.
# Rake tasks automatically ignore this option for performance.
config.eager_load = false
....

我的路由文件中带有设计路由的部分:

config/routes.rb

######################
###    Members     ###
######################

  devise_for :members, 
              controllers: {
                sessions: 'members/sessions',
                registrations: 'members/registrations'
              },
              path: '', path_names: { 
                  sign_in:    'login', 
                  sign_out:   'logout', 
                  sign_up:    'register',
                  edit:       ':username/account/edit'
              }

我可以确认自定义的 Devise 控制器嵌套正确并且拼写正确,因为登录和注册都在本地开发中工作。

这是当我运行 heroku rake routes 时 MembersController 的结果

        new_member_session GET    /login(.:format)                       members/sessions#new
            member_session POST   /login(.:format)                       members/sessions#create
    destroy_member_session DELETE /logout(.:format)                      members/sessions#destroy
       new_member_password GET    /password/new(.:format)                devise/passwords#new
      edit_member_password GET    /password/edit(.:format)               devise/passwords#edit
           member_password PATCH  /password(.:format)                    devise/passwords#update
                           PUT    /password(.:format)                    devise/passwords#update
                           POST   /password(.:format)                    devise/passwords#create
cancel_member_registration GET    /cancel(.:format)                      members/registrations#cancel
   new_member_registration GET    /register(.:format)                    members/registrations#new
  edit_member_registration GET    /:username/account/edit(.:format)      members/registrations#edit
       member_registration PATCH  /                                      members/registrations#update
                           PUT    /                                      members/registrations#update
                           DELETE /                                      members/registrations#destroy
                           POST   /                                      members/registrations#create

app/models/member.rb

class Member < ApplicationRecord
  has_one :profile, dependent: :destroy
  has_many :involvements, dependent: :destroy
  has_many :donations

  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  accepts_nested_attributes_for :profile

  validates_uniqueness_of :email
end

成员控制器

app/controllers/Members/sessions_controller.rb

class Members::SessionsController < Devise::SessionsController
  # before_action :configure_sign_in_params, only: [:create]

  # GET /resource/sign_in
  def new
    if params[:return_page]
      session[:member_return_to] = params[:return_page]
    end

    if params[:add_support]
      flash[:warning] = 'You need to login or register for an account first.'
      session[:add_support] = params[:add_support]
      @support = Support.find_by(url_friendly_title: params[:add_support])
      session[:member_return_to] = support_page_path(@support.url_friendly_title)
    end

    if params[:return_page] || params[:add_support]
      redirect_to new_member_session_path
      return
    end

    super
  end

  # POST /resource/sign_in
  # def create
  #   super
  # end

  # DELETE /resource/sign_out
  # def destroy
  #   super
  # end

  # protected

  # If you have extra params to permit, append them to the sanitizer.
  # def configure_sign_in_params
  #   devise_parameter_sanitizer.permit(:sign_in, keys: [:attribute])
  # end
end

请帮忙

您可以就为什么没有在 Heroku 上初始化成员的设计模型提供任何帮助,我们将不胜感激。我是否忘记了部署时需要更改的某些设置?

【问题讨论】:

  • 模型不应该是会员吗? (单数)
  • 在路线中?我刚刚更新了我的问题以显示模型声明,它在那里是单数的。我确实将测试路线从devise_for :members, 更改为devise_for :member, 并将其推高,并得到相同的错误。我很惊讶它仍在开发中,我认为它必须是复数“成员”。
  • 查看设计文档,它看起来确实与复数或单数时态一起使用;但是,与devise_for 一起使用时总是复数:github.com/plataformatec/devise/wiki/…
  • @Pablo 它应该是复数 devise_for :members。这与 rails resources 宏的行为相匹配。 github.com/plataformatec/devise#configuring-controllers
  • 控制器是否声明为Members::SessionsController,是app/controllers/members/sessions_controller.rb中的文件吗?

标签: ruby-on-rails heroku devise


【解决方案1】:

经过大量研究,导致此错误的原因有很多。我将发布解决导致此错误的特定问题的答案,以防将来有人遇到同样的问题。

现在,在明天启动我的网站之前解决最后的问题。感谢大家帮助追踪问题。

答案:

如果您查看我的问题,则 session_controller.rb 嵌套在“成员”而不是“成员”下。正如@max 在他澄清 cmets 中指出的那样,我本地机器上的文件系统不区分大小写,而在生产中它是区分大小写的。所以,这就是“成员”没有被初始化的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-04
    • 2013-08-25
    • 2016-01-16
    • 2016-01-19
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    相关资源
    最近更新 更多