轨道 - 重定向至不保存历史记录



我的应用程序使用Devise,我自定义会话控制器以通过otp代码处理登录,我的控制器:

class SessionsController < Devise::SessionsController
def new
end
def create
mobile_number = User.set_number(params[:mobile_number], params[:country_code])
@user = User.active.fetch_user(nil, mobile_number)
if @user
otp = Sms.send_sms(mobile_number)
if otp == false
flash[:alert] = 'OTP Sending failed'
else
@user.otp = otp
@user.otp_generated_at = Time.zone.now
redirect_to sessions_otp_form_path(id: @user.id) if @user.save
end
else
flash[:alert] = 'User not found'
end
end
end

路线:

devise_for :users,
path: '',
path_names: { sign_in: 'login', sign_out: 'logout', registration: 'signup', sign_up: '' },
controllers: { sessions: 'sessions', registrations: 'registrations', passwords: 'passwords'}
devise_scope :user do
post '/send_otp', to:'sessions#send_otp'
get 'sessions/otp_form'

我的观点:

<div class="login_form">
<%= form_with model:@user, url:user_session_path do |f| %>
...
</div>

从主页,我点击登录按钮进入/login页面,如果我输入了正确的号码,我将被重定向到otp表单(sessions/otp_form(,在那里我可以使用otp代码登录。问题发生在这里,当我在otp表单中时,我想通过点击浏览器返回到上一个页面(我键入电话号码的登录页面(,但是浏览器没有后退到以前的URL(在这种情况下为/login(,而是后退两步进入主页。

我检查了浏览器(firefox和chrome(,login路径没有存储。

为了确保问题不是来自redirect_to,我创建了一个简单的表单,然后提交->重定向->在这种情况下,我可以一步一步回到以前的URL。我还创建了一个简单的应用程序,该应用程序使用Devise而无需任何自定义,并且运行良好(不会丢失以前的路径(。目前,我不确定我的代码发生了什么。如有任何意见和建议,我们将不胜感激。

我找到了原因。它与后端无关。由于我的形式:

<div class="login_form">
<%= form_with model:@user, url:user_session_path do |f| %>
...
</div>

默认情况下,form_withdata-remote属性附加到表单。因此,表单将使用Ajax提交。这就是这段历史失败的原因。因此,为了解决我的问题,我在表单中添加了:local: true选项,禁用了默认功能。

<div class="login_form">
<%= form_with model:@user, url:user_session_path, local: true do |f| %>
...
</div>

最新更新