[英]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.