【发布时间】: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。这与 railsresources宏的行为相匹配。 github.com/plataformatec/devise#configuring-controllers -
控制器是否声明为
Members::SessionsController,是app/controllers/members/sessions_controller.rb中的文件吗?
标签: ruby-on-rails heroku devise