Rails教程:命名路由和登录表单

时间:2012-08-14 20:55:32

标签: ruby-on-rails railstutorial.org

我正在使用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的网址。谢谢。

1 个答案:

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

应该这样做。