簡體   English   中英

僅限生產中的 ActionController::RoutingError(未初始化的常量成員)

[英]ActionController::RoutingError (uninitialized constant Members) in Production Only

我已經閱讀了很多不同的問題,但找不到我的答案。 似乎其他所有人都在開發中遇到了這個問題,這是由於命名問題。 我在開發中一切正常,但在生產中出現錯誤。

網絡應用信息:

導軌: 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
....

帶有設計路由的路由文件部分:

配置/路由.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

應用程序/模型/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

成員控制器

應用程序/控制器/成員/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 上初始化為會員設計的模型提供任何幫助,我們將不勝感激。 我是否忘記了部署時需要更改的某些設置?

經過大量研究,導致此錯誤的原因有很多。 我將發布解決導致此錯誤的特定問題的答案,以防將來有人遇到相同的問題。

現在,在明天啟動我的網站之前解決最后的問題。 感謝大家幫助追蹤問題。

回答:

如果您查看我的問題,則 session_controller.rb 嵌套在“成員”而不是“成員”下。 正如@max 在他的澄清評論中指出的那樣,我本地機器上的文件系統不區分大小寫,而在生產中則區分大小寫。 所以,這就是“Members”沒有被初始化的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM