我正在使用rails教程(railstutorial.org),并在发生验证时发现了登录表单的问题。我采取这一行动的途径是:
match '/signin', to: 'sessions#new'
验证发生时,页面的URL切换到/ sessions。我的会话控制器如下所示:
class SessionsController < ApplicationController
def new
end
def create
user = User.find_by_email(params[:session][:email])
if user && user.authenticate(params[:session][:password])
sign_in user
redirect_back_or user
else
flash.now[:error] = "Invalid email/password combination"
render 'new'
end
end
我的问题是如何让这个经过验证的表单仍然显示为/ signin的网址。谢谢。
答案 0 :(得分:1)
如果你想继续使用restful路由(这是Rails的当前和长期标准),你不能。如果您不介意偏离此路径,则可以创建一些自定义路由,而不是使用“普通”资源样式路由。
首先,您必须更改控制器并将登录操作从create
方法移至new
方法(这是/ signin路由到的方式):
class SessionsController < ApplicationController
def new
if request.post?
user = User.find_by_email(params[:session][:email])
if user && user.authenticate(params[:session][:password])
sign_in user
redirect_back_or user
else
flash.now[:error] = "Invalid email/password combination"
end
end
end
end
这意味着初始GET / signin请求和最终的POST / signin请求都将由同一操作处理。如果检测到POST,它将尝试登录用户并重定向成功。如果发出了GET请求,它只会将表单呈现为正常。
然后您必须更改登录表单(app / views / sessions / new.html.erb)以使用登录路径而不是正常路线:
<% form_tag '/signin' do %>
....
<% end -%>
应该这样做。