【问题标题】:Rails/Devise: Nil location provided. Can't build URI. on Password resetRails/Devise:提供无位置。无法构建 URI。关于密码重置
【发布时间】:2016-03-25 04:36:38
【问题描述】:

我正在使用 Rails 4.2 和 Devise。每当我尝试使用重置密码页面时,我都会收到以下错误:

Nil location provided. Can't build URI. on Password reset

在生产中它带有 500 内部服务器错误。

带有重置令牌的电子邮件确实会发送。如果用户在他们的电子邮件中打开链接,他们可以返回该站点更改密码。尽管如此,单击“重置密码按钮”时总是会出现 500 错误。

我之前用过很多次,从来没有遇到过这个问题。我怀疑它可能与本教程有关:

https://github.com/plataformatec/devise/wiki/How-To:-Display-a-custom-sign_in-form-anywhere-in-your-app

并在我的应用程序控制器中明确编写resource_nameresourcedevise_mapping 方法,但它们并没有干扰任何其他设计路线,即使将它们注释掉,错误仍然存​​在。

编辑:

我没有PasswordController,只是坚持使用 Devise 的大部分默认设置。我也没有在我的应用程序的任何地方使用respond_with

我的设计模型如下所示:

class User < ActiveRecord::Base
    devise :database_authenticatable, :registerable, :confirmable, :lockable,
     :recoverable, :rememberable, :trackable, :validatable, 
     :omniauthable, :omniauth_providers => [:stripe_connect]


    validates :username, presence: true
    validates :time_zone, presence: true
    has_one :teacher, dependent: :destroy
    has_many :bookings, foreign_key: :student_id
    has_many :reviews, foreign_key: :student_id, dependent: :destroy
    has_many :messages, dependent: :destroy
    VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
    validates_format_of :email, with: VALID_EMAIL_REGEX

end

编辑 3:

以下是相关路线:

get 'sessions/create'
devise_for :users, :controllers => { :omniauth_callbacks => "omniauth_callbacks" }
resources :users, :only =>[:show]

devise_scope :user do
    get 'bookings', to: 'bookings#bookings'
end

这里是视图:

<%= form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => { :method => :post, :class => "sky-form" }) do |f| %>
  <%= devise_error_messages! %>
  <h3 class="text-center"><%= t('.header') %></h3>
  <section>
    <div class="row">
      <label class="label col col-4"><%= t('.email') %></label>
        <div class="col col-8">
          <label class="input">
            <%= f.email_field :email %>
          </label>
        </div>
      </div>
    </section>
    <footer class="text-right">
      <%= f.submit t('.resetpwbtn'), class: "btn btn-theme-bg btn-lg" %>
    </footer>
  <% end %>

【问题讨论】:

  • 你在调用 JSON api?
  • Shiv Raj:不,我不是。
  • 您需要分享您的 Devise 模型、PasswordsController(如果有)以及其他信息,例如 Devise 生成的迁移文件,以便我们了解更多信息。
  • 我只是写在方法里。但我没有使用PasswordsController

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


【解决方案1】:

在使用新的涡轮/热线时,设计可能会发生这种情况。

在我的例子中,我自定义了表单以设置"data-turbo": "false"

像这样:

<%= form_for(resource, as: resource_name, url: confirmation_path(resource_name), html: { "data-turbo": "false", method: :post }) do |f| %>

如果您还没有这样做,则需要使用 Devise 自定义视图:https://dev.to/n350071/customize-view-of-devise-3k95

【讨论】:

  • 显然不是最初的问题,但这为我节省了在 Rails 7 / Hotwire / Turbo 上调试的大量时间。谢谢!
【解决方案2】:

如果您使用respond_with,它只能与资源一起使用。我遇到了这个问题,解决方法是给你render

如果是这样的话

render :text => 'false'

可能会有所帮助。但可以肯定的是,我们必须查看您的模型才能找出更多问题。

另一个问题,可能是 responds_with 需要一个 ActiveRecord 对象来绘制路线。

我不确定它是如何在您的代码中实现的,但这些是我过去解决此错误的一些方法。

【讨论】:

  • 我只是看了看,并没有在我的应用程序的任何地方使用respond_with。我更新了我的模型,如果你愿意看的话。
  • 您的路线是什么样的,以及视图中的实现?这在开发中有效吗?
  • 我添加了相关的路线和视图。也不,它在开发中也不起作用。实际上,电子邮件确实发送并且该过程有效。就是表单提交后网站崩溃了。
  • 问题是设计控制器中的respond_withgithub.com/heartcombo/devise/blob/…
【解决方案3】:

我在另一个项目中遇到了这个问题。就我而言,我缺少create 操作的模板文件。如果我们查看 devise 的 create 函数,它使用 respond_with 方法根据请求的“Accept”标头的 mime 类型呈现正确的信息。例如,对于 html 响应,它可能会尝试加载 create.html.erb(或其他模板类型,具体取决于您的配置)。

有点晚了,希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多