POST登录路由在生产中不起作用

时间:2015-12-25 08:20:09

标签: ruby-on-rails ruby heroku url-routing production-environment

我是ruby on rails的新手。我正在开发一个具有认证系统的应用程序 我的问题是我在登录生产中的应用程序时遇到错误(Heroku)。它正在开发中。

错误
我在输入网址https://akashpinnaka.herokuapp.com/login后进行制作, 它正在重定向到https://akashpinnaka.herokuapp.comlogin。对于POST登录,我错过了root_url和'login'之间的'/'。
注意:在开发环境中工作
我的路线是

Rails.application.routes.draw do

get 'welcome/index'
root 'welcome#index'
resources :articles
resources :projects
resources :users

get '/login' => 'sessions#new'
post '/login' => 'sessions#create'
delete 'logout' => 'sessions#destroy'

end

会话控制器

class SessionsController < ApplicationController

  def new
  end

  def create
    @user = User.find_by_email(params[:session][:email])
    if @user && @user.authenticate(params[:session][:password])
      session[:user_id] = @user.id
      redirect_to root_path
    else
      redirect_to 'login'
    end
  end

  def destroy
    session[:user_id] = nil
    redirect_to '/'
  end

end

会话#新

<%= form_for(:session, url: login_path) do |f| %> 
  <%= f.email_field :email, :placeholder => "Email" %> 
  <%= f.password_field :password, :placeholder => "Password" %> 
  <%= f.submit "Log in" %>
<% end %>

3 个答案:

答案 0 :(得分:3)

通常,当您的表单无法保存时,您不会重定向。您显示相同的表单,并提供错误说明。

  def create
    @user = User.find_by_email(params[:session][:email])
    if @user && @user.authenticate(params[:session][:password])
      session[:user_id] = @user.id
      redirect_to root_path
    else
      # should've been login_path
      # redirect_to 'login'

      render 'new' # this is better
    end
  end

如果您确定要重定向,请务必继续。但提供正确的路径:)

答案 1 :(得分:2)

您需要使用redirect_to '/login'redirect_to login_path代替redirect_to 'login'

@Sergio Tulentsev的回答非常好。

答案 2 :(得分:1)

您应该修改路线:

#config/routes.rb
root "welcome#index"
resources :articles, :projects, :users
resources sessions, only: [:new, :create, :destroy], path_names: { new: "login", create: "login", destroy: "logout" } 

Rails有两组路径助手 - _path and _url

  正如我们所知,

_path是提供相对路线(/path)。

     

_url可提供直接路线(http://domain.com/path

因此,当你有:

在您的路线中

get "/login"(带有前导斜线),几乎肯定会导致您的应用程序出现问题。相关链接助手。

正如@Sergio Tulentsev所述,您的create方法和destroy方法应该被修复以使用正确的路径助手:

def create
    @user = User.find_by email: params[:session][:email]
    if @user && @user.authenticate(params[:session][:password])
       session[:user_id] = @user.id
       redirect_to root_path
    else
       redirect_to login_path
    end
end

def destroy
    ...
    redirect_to root_path
end

值得@Sergiorender :new命令的建议!