【问题标题】:Customizing the confirmation_url in Devise在设计中自定义确认 URL
【发布时间】:2010-10-21 10:25:07
【问题描述】:

如何在邮件视图中自定义 Devise 生成的这个默认行?

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

我在控制器中编写了一个名为user_confirm 的方法。我还为它定义了一条路线。我可以获取 URL 以链接到以令牌作为参数的该方法吗?

【问题讨论】:

    标签: ruby-on-rails devise


    【解决方案1】:

    我使用了这个路由:

    map.user_confirm 'confirm/:confirmation_token',
        :controller => 'confirmations', :action => 'show'
    

    还有这个 ERB:

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

    得到了这个不错的链接:

    http://localhost:3000/confirm/RjOnrd5yNREEDwsEfiFa
    

    【讨论】:

    • 如果我希望用户在生产环境中被重定向到 https,我应该做些什么改变?
    • 我现在发送的链接是 http ,用户也得到了他的令牌,但是由于应用程序托管在 https 上,它无法识别令牌:|
    • Devise 3 更新:devise 现在使用较短的令牌,然后在与数据库进行比较之前对其进行哈希处理。您的邮件链接应如下所示:link_to 'Confirm my account', confirmation_url(@resource, confirmation_token: @token)
    【解决方案2】:

    类似于(在 routes.rb 中):

    devise_scope :user do
      match '/confirm/:confirmation_token', :to => "devise/confirmations#show", :as => "user_confirm", :only_path => false
    end
    

    在视图中你可以使用类似的东西:

    <%= link_to 'Confirm my account', user_confirm_url(@resource.confirmation_token) %>
    

    适用于 Rails 3。

    【讨论】:

    • 这似乎比接受的答案更好,除非我误解了。这适用于 Rails 3.2。注意:"devise/confirmations#show 明确表示使用默认的设计确认控制器。如果您有自定义确认控制器,请改用 confirmations#show,否则您会遇到意外行为。
    【解决方案3】:
    • rails 4.0.5
    • devise 3.2.4

    之前

    网址:

    http://example.com/users/confirmation?confirmation_token=jevYKv1z9Pr1LsAUB2NX
    

    app/views/devise/mailer/confirmation_instructions.html.erb:

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

    之后

    config/routes.rb:

    devise_scope :user do
        get 'confirm/:confirmation_token', to: 'devise/confirmations#show'
    end
    

    app/views/devise/mailer/confirmation_instructions.html.erb:

    <p><%= link_to 'Confirm my acount', confirm_url(@token) %></p>
    

    网址:

    http://example.com/confirm/Kezap1iutgvXyQAhyu64
    

    【讨论】:

      【解决方案4】:

      知道了。 假设我这样定义我命名的路线。

      map.user_confirm '/user_confirm',  :controller => 'users', :action => 'confirm'
      

      我要做的就是

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

      【讨论】:

        【解决方案5】:

        自定义设计URL不会更新用户表的'confirmed_at'列,你可以做的是点击确认链接后重定向用户:

        第 1 步 覆盖您的确认控制器中的 after_confirmation_path_for:

        在app/controllers目录下新建confirms_controller.rb:

        class ConfirmationsController < Devise::ConfirmationsController
          private
          def after_confirmation_path_for(resource_name, resource)
          your_new_after_confirmation_path
         end
        end
        

        第 2 步 在 config/routes.rb 中,添加此行,以便 Devise 使用您的自定义 ConfirmationsController。这假设 Devise 对用户表进行操作(您可以编辑以匹配您的表)。

        devise_for :users, controllers: { confirmations: 'confirmations' }
        

        第 3 步重新启动网络服务器

        【讨论】:

          猜你喜欢
          • 2015-01-05
          • 1970-01-01
          • 2012-09-03
          • 1970-01-01
          • 1970-01-01
          • 2016-08-21
          • 1970-01-01
          • 1970-01-01
          • 2011-08-12
          相关资源
          最近更新 更多