【问题标题】:devise confirmable not working in newest version设计可确认不能在最新版本中工作
【发布时间】:2011-10-31 12:42:57
【问题描述】:

我最近从 Devise 1.2 升级到 1.4.9,除了我的可确认模块外,一切似乎都正常。电子邮件与整个过程一样有效。但是确认页面总是空白的。它可以工作并确认电子邮件帐户,但不会重定向用户并引发 406 错误。对于错误的确认尝试也是如此。

路线似乎工作正常,我在我的用户模型中指定了可确认的,其他没有任何改变。

有什么想法吗?我是否缺少某些设置或需要为 1.4.9 更新的内容?

更新

生成的 URL 似乎有问题。出于某种未知原因,它在确认 URL 前加上用户名?这导致它破裂。但我仍然不确定如何解决它。

http://localhost:5000/users/confirmation.someusername?confirmation_token=R7apAPhC5c3rszvhsowp

上面 URL 中的用户名导致进程无法工作。

我检查了 1.2 中的控制器(有效)和新版本之间的差异。

1.2

  # GET /resource/confirmation?confirmation_token=abcdef
  def show
    self.resource = resource_class.confirm_by_token(params[:confirmation_token])

    if resource.errors.empty?
      set_flash_message :notice, :confirmed
      sign_in_and_redirect(resource_name, resource)
    else
      render_with_scope :new
    end
  end

1.4.9

  # GET /resource/confirmation?confirmation_token=abcdef
  def show
    self.resource = resource_class.confirm_by_token(params[:confirmation_token])

    if resource.errors.empty?
      set_flash_message(:notice, :confirmed) if is_navigational_format?
      sign_in(resource_name, resource)
      respond_with_navigational(resource){ redirect_to after_confirmation_path_for(resource_name, resource) }
    else
      respond_with_navigational(resource.errors, :status => :unprocessable_entity){ render_with_scope :new }
    end
  end

  protected

    # The path used after resending confirmation instructions.
    def after_resending_confirmation_instructions_path_for(resource_name)
      new_session_path(resource_name)
    end

    # The path used after confirmation.
    def after_confirmation_path_for(resource_name, resource)
      after_sign_in_path_for(resource)
    end

错误

Started GET "/users/confirmation.sdfsdfsd?confirmation_token=vmxmx73xvM7sUfcvH9CX" for 127.0.0.1 at 2011-10-31 13:30:33 +0100
  Processing by Devise::ConfirmationsController#show as 
  Parameters: {"confirmation_token"=>"vmxmx73xvM7sUfcvH9CX"}
  SQL (1.1ms)   SELECT a.attname, format_type(a.atttypid, a.atttypmod), d.adsrc, a.attnotnull
 FROM pg_attribute a LEFT JOIN pg_attrdef d
 ON a.attrelid = d.adrelid AND a.attnum = d.adnum
 WHERE a.attrelid = '"users"'::regclass
 AND a.attnum > 0 AND NOT a.attisdropped
 ORDER BY a.attnum

  User Load (1.2ms)  SELECT "users".* FROM "users" WHERE "users"."confirmation_token" = 'vmxmx73xvM7sUfcvH9CX' LIMIT 1
  SQL (0.7ms)   SELECT a.attname, format_type(a.atttypid, a.atttypmod), d.adsrc, a.attnotnull
 FROM pg_attribute a LEFT JOIN pg_attrdef d
 ON a.attrelid = d.adrelid AND a.attnum = d.adnum
 WHERE a.attrelid = '"users"'::regclass
 AND a.attnum > 0 AND NOT a.attisdropped
 ORDER BY a.attnum

Completed 406 Not Acceptable in 28ms

【问题讨论】:

  • 很明显 url 导致 406 /users/confirmation.someusername?... “.someusername”(包括点)将被视为您想要返回的响应格式。所以也许如果你尝试在你的 route.rb 文件中准备路由规则可以修复这个get /users/confirmation.:username", :controller => :users, :action=> confirmation ...

标签: ruby-on-rails ruby-on-rails-3 authentication devise


【解决方案1】:

其他人为我指出了正确的方向,但这是我的确切解决方案。问题出在我从 1.2 复制过来的设计视图模板中?看起来他们将链接助手从 user_confirmation_url() 更改为 simply confirmation_url()

旧确认邮件

<p>Welcome <%= @resource.email %>!</p>

<p>You can confirm your account through the link below:</p>

<p><%= link_to 'Confirm my account', user_confirmation_url(@resource, :confirmation_token => @resource.confirmation_token) %></p>

新的确认模板

<p>Welcome <%= @resource.email %>!</p>

<p>You can confirm your account through the link below:</p>

<p><%= link_to 'Confirm my account', confirmation_url(@resource, :confirmation_token => @resource.confirmation_token) %></p>

【讨论】:

    【解决方案2】:

    看看你是否复制了设计视图,它们可能已经过时了。

    我有一个类似的 issue 在我的 url 中获取奇怪的用户 ID,设计不再使用 user_confirmation_url 来支持 confirmation_url(从 1.0 开始?,但它仍然工作更长时间)所以你可以删除您的自定义设计视图或更新 url 助手。

    【讨论】:

      【解决方案3】:

      最新的设计代码是

      <p><%= link_to 'Confirm my account', model_confirmation_url(:confirmation_token => @model.confirmation_token) %></p>
      

      版本
      设计-2.1.2

      【讨论】:

        【解决方案4】:

        对于我的情况(Rails 4.2 和设计 3.4.1)

        修复生成的视图(在 app/views/devise/mailer/confirmation_instructions.html.erb 中)需要将 user_confirmation_url 中的 @resource 删除为:

        @token ) %>

        【讨论】:

          【解决方案5】:

          就我而言,我在视图/设计下有自定义视图,例如使用 users_confirmation_url 查看/设计/确认/new.html.erb。将它们移到视图/用户下并使用确认 URL 后,我不再收到任何错误。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-07-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-22
            • 2015-11-18
            • 1970-01-01
            相关资源
            最近更新 更多