Ruby on rails 更改表单重定向到的位置

Ruby on rails 更改表单重定向到的位置,ruby-on-rails,Ruby On Rails,以下是当用户(未登录)遵循我在电子邮件中发送给他们的确认链接时,用户确认的工作方式: 更新:好的,考虑一下,用户确认只是测试电子邮件地址是否存在,与安全无关。尽管如此,我还是想知道如何更改表单重定向到的位置,以这个问题为例 这有点笨拙。我宁愿这样: 我想消除第二次跟踪链接的需要,但我不确定如何继续。这是我的签名表: <%= form_for(:session, url: sessions_path) do |f| %> <%= f.label 'Email addres

以下是当用户(未登录)遵循我在电子邮件中发送给他们的确认链接时,用户确认的工作方式:

更新:好的,考虑一下,用户确认只是测试电子邮件地址是否存在,与安全无关。尽管如此,我还是想知道如何更改表单重定向到的位置,以这个问题为例

这有点笨拙。我宁愿这样:

我想消除第二次跟踪链接的需要,但我不确定如何继续。这是我的签名表:

<%= form_for(:session, url: sessions_path) do |f| %>
    <%= f.label 'Email address' %><br>
    <%= f.text_field :email, class: 'form-control', placeholder: 'Enter email' %><br>

    <%= f.label 'Password' %><br>
    <%= f.password_field :password, class: 'form-control', placeholder: 'Enter password' %><br>


    <%= f.submit 'Sign In', class: 'btn btn-default' %>
<% end %>
现在我相信关键在于行动的第5行:

redirect_to user_path(current_user)
这需要改变。我相信我可以一起解决一些问题,但我想知道你将如何解决这个问题

  • 确认路径的操作必须设置一个变量,该变量将存储我们想要的新路径
  • create actions redirect_to然后应在其默认用户_路径上使用此变量
  • 然后应清空变量,以便再次登录不会重定向到确认操作
  • 要执行此操作,应将此变量存储在何处?在会议中
  • 我应该如何以最开放的方式解决这个问题,以便在需要时可以轻松地为其他形式解决这个问题
  • 记住这一点,我们存储路径的变量可能应该是散列,也可能是多个键值对。然后,动态表单的创建操作只检查与它们相关的键值
  • 我对宝石过敏,因为它们会阻止人们学习,但是如果你知道有任何这样做的,我还是想知道。但请先教我怎么为自己做:)

    • 根据我们的意见,我首先创建一个确认模型

      rails g model Confirmation key:string user_id:integer
      
      您可以通过回调生成随机哈希:

      require 'securerandom'
        ...
        before_validation :generate_random_key
        belongs_to :user  
        validates_uniqueness_of :user_id
        ...
        private
      
        def generate_random_key
          self.key = SecureRandom.hex(32)
        end
      
      然后,用于创建新注册的控制器为新用户向该模型添加一条记录。此外,
      用户
      模型具有一个
      has_one:confirmation
      关系是合适的。(Rails
      有一个_one
      实际上意味着零或一。)

      接下来,制作一个确认控制器,将用户的状态设置为“已确认”。比如:

      rails g controller confirmation new
      
      .../confirmation?key=<long hex string>
      
      然后我将编辑
      config/routes.rb
      以使用单个CRUD资源路径,因为只有

      resource :confirmation, only: :new
      
      这样,您的电子邮件中的路径应该如下所示:

      rails g controller confirmation new
      
      .../confirmation?key=<long hex string>
      
      ../confirmation?键=
      
      以及控制器:

      class ConfirmationController < ApplicationController
      
        def new
          key = params[:key]
          user = key && User.joins(:confirmation).where(key: key)
          if user
            user.confirmation.destroy  # Kill the confirmation. It's not needed any more.
            user.confirmed = true      # Mark the user confirmed
            user.save!                 # Update her record.
            flash[:alert] = 'Your registration has been confirmed. Log in for full service!'
          else
            flash[:error] = 'Your confirmation link is broken or expired. Log in to request a new one.'
          end
          redirect_to controller: :sessions, :action: :new 
        end
      
      end
      
      类确认控制器
      会话控制器应重定向到未经确认的用户登录时显示的“无服务”登录页。这几乎是唯一的一件事,将有一个链接,要求一个新的确认电子邮件。对于已确认的用户登录,它将重定向到完整服务登录页


      在创建新的确认记录之前,删除用户现有的任何旧确认记录。如果需要,可以使用后台作业使未使用的作业过期。

      根据我们的评论,我首先创建一个确认模型

      rails g model Confirmation key:string user_id:integer
      
      您可以通过回调生成随机哈希:

      require 'securerandom'
        ...
        before_validation :generate_random_key
        belongs_to :user  
        validates_uniqueness_of :user_id
        ...
        private
      
        def generate_random_key
          self.key = SecureRandom.hex(32)
        end
      
      然后,用于创建新注册的控制器为新用户向该模型添加一条记录。此外,
      用户
      模型具有一个
      has_one:confirmation
      关系是合适的。(Rails
      有一个_one
      实际上意味着零或一。)

      接下来,制作一个确认控制器,将用户的状态设置为“已确认”。比如:

      rails g controller confirmation new
      
      .../confirmation?key=<long hex string>
      
      然后我将编辑
      config/routes.rb
      以使用单个CRUD资源路径,因为只有

      resource :confirmation, only: :new
      
      这样,您的电子邮件中的路径应该如下所示:

      rails g controller confirmation new
      
      .../confirmation?key=<long hex string>
      
      ../confirmation?键=
      
      以及控制器:

      class ConfirmationController < ApplicationController
      
        def new
          key = params[:key]
          user = key && User.joins(:confirmation).where(key: key)
          if user
            user.confirmation.destroy  # Kill the confirmation. It's not needed any more.
            user.confirmed = true      # Mark the user confirmed
            user.save!                 # Update her record.
            flash[:alert] = 'Your registration has been confirmed. Log in for full service!'
          else
            flash[:error] = 'Your confirmation link is broken or expired. Log in to request a new one.'
          end
          redirect_to controller: :sessions, :action: :new 
        end
      
      end
      
      类确认控制器
      会话控制器应重定向到未经确认的用户登录时显示的“无服务”登录页。这几乎是唯一的一件事,将有一个链接,要求一个新的确认电子邮件。对于已确认的用户登录,它将重定向到完整服务登录页

      在创建新的确认记录之前,删除用户现有的任何旧确认记录。如果需要,使用后台作业使未使用的作业过期

      尽管如此,我还是想知道如何更改表单重定向到的位置,以这个问题为例

      我可以给你一个想法和大家遵循的最普遍的做法

      如果用户未登录,您只需保存请求的路径并重定向到该部分即可。Desive gem也使用相同的策略,如果您使用该策略,您可以利用它的优势

      我在描述一般解决方案。要保存和获取存储的位置,您需要在
      应用程序
      控制器中使用两种方法

      store\u lo