不同的前缀:“/”和“http:/ localhost:3000”与设计

时间:2017-11-09 15:57:29

标签: ruby-on-rails ruby devise ruby-on-rails-5

我正在使用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克隆了它。

1 个答案:

答案 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将替换为基于UserAdmin模型的对象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的输出吗?