0

我正在阅读 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 的 url。谢谢你。

4

1 回答 1

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 -%>

那应该这样做。

于 2012-08-14T21:16:28.403 回答