我正在使用rails 5.1.4设计。当我尝试使用错误的密码登录时,我收到此错误:
不同的前缀:“/”和“http:/ localhost:3000”
我正在使用rbenv和ruby 2.4.1。我对ruby 2.3.3也有同样的问题。
这是完整的堆栈跟踪:
res = Net::HTTP.get_response(...
知道这可能来自哪里?
更新 我在cloud9上创建了一个工作区,看看该项目是否在其他机器上工作正常,确实如此!所以我的ruby安装似乎有问题。在问题开始发生之前,我已经破坏了我的linux机器上的项目文件夹,并再次从bitbucket克隆了它。
答案 0 :(得分:0)
这是您行动的设计工作流程。
您填写了session/new.html.erb
表格。 Devise使用form_for
将表单绑定到对象,并使用RESTful
文件中的routes.rb
路由。
<%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
此form_for
代码会生成以下html表单,resource
将替换为基于User
或Admin
模型的对象SessionsController#new
action使用代码self.resource = resource_class.new(sign_in_params)
<form accept-charset="UTF-8" action="/users" method="post" class="nifty_form">
当您点击POST
按钮时,html表单会触发/users
网址submit
请求。
将从您的服务器路由器收到POST
请求,该请求基于您在routes.rb
上配置的设置将决定如何响应 。
如果您的routes.rb
文件配置为设计指南,那么这将是您的routes.rb
文件
devise_for :users
生成以下路线
user_session POST /users/sign_in {controller:"devise/sessions", action:"create"}
所以当从服务器收到request
时,应该从sessions_controller.rb#create
action处理。您可以在Github或RVM或RBENV文件夹中安装的GEMS中显示此控制器。您也可以通过设置binding.pry
# POST /resource/sign_in
def create
self.resource = warden.authenticate!(auth_options)
set_flash_message!(:notice, :signed_in)
sign_in(resource_name, resource)
yield resource if block_given?
respond_with resource, location: after_sign_in_path_for(resource)
end
当您决定使用错误的身份验证时,您将调用此method
def authenticate!
resource = password.present? && mapping.to.find_for_database_authentication(authentication_hash)
hashed = false
if validate(resource){ hashed = true; resource.valid_password?(password) }
remember_me(resource)
resource.after_database_authentication
success!(resource)
end
mapping.to.new.password = password if !hashed && Devise.paranoid
fail(:not_found_in_database) unless resource
end
因此,当您提供无效密码和电子邮件时,validate(resource){ hashed = true; resource.valid_password?(password) }
将返回false并执行此代码
mapping.to.new.password = password if !hashed && Devise.paranoid
fail(:not_found_in_database) unless resource
由于某些原因会重定向到错误的网址。
我认为此代码旨在显示您网页中的错误session/new.html.erb
。所以我相信Devise标准控制器中没有GET request
,只是用错误信息重新渲染视图。
所以我的问题是,你是否覆盖了Devise控制器给它这种行为?您能与我们分享您的routes.rb
文件和rake routes
的输出吗?