使用路线匹配渲染相同的页面

时间:2012-08-03 06:19:19

标签: ruby-on-rails

我正在尝试通过开发自己的自定义CMS来学习RoR(是的,是的......)而且我想做一件简单的事情,但我无法想出一个干净的解决方案。

我的路线文件具有以下匹配:

match '/login' => "sessions#new"

它的作用是,在点击“http:// localhost:3000 / login”时,让我登录以创建一个新会话。它完美地运作......

但是,这就是我的Sessions控制器的样子:

class SessionsController < ApplicationController
  def create    
    @username = params[:session][:username]
    @password = params[:session][:password]
    @rUser = User.find_by_username(params[:session][:username])

  #if user && user.authenticate(params[:session][:password])
    if @rUser && Digest::SHA2.hexdigest(@password) == @rUser.password
      # Sign the user in and redirect to the user's show page.
      redirect_to users_path, :flash => { :notice => "Logged in as #{@username}." }
    else      
      # Create an error message and re-render the signin form.
      redirect_to '/login', :flash => { :error => "Login failed.  Either the username or password was incorrect." }
    end
  end
end

如果你看一下if-else条件中的“else”语句,你会发现我正在使用redirect_to'/ login'在登录失败时显示相同的表单。有没有更好的方法来创建永久链接到'/ login'而不必使用字符串,因为如果我决定在将来更改URL,我宁愿不必在多个地方进行更改。

很抱歉,如果不清楚的话!随意请求进一步的代码(不要担心它的可怜性)。

2 个答案:

答案 0 :(得分:4)

match '/login' => "sessions#new", :as => :login

然后您可以在控制器中使用login_path

答案 1 :(得分:2)

你可以这样做

 match '/login' => "sessions#new", :as => :login    

      #if want to call like localhost:3000/login

 match '/sign_in' => "sessions#new", :as => :sign_in

     #if want to call like localhost:3000/sign_in