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

问题描述 投票:5回答:3

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

错误
我在输入url 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 %>
ruby-on-rails ruby heroku url-routing production-environment
3个回答
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

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


2
投票

您需要使用redirect_to '/login'redirect_to login_path而不是redirect_to 'login'

@Sergio Tulentsev的答案非常好。


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 path _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

值得@Sergio关于render :new的建议render :new命令!

© www.soinside.com 2019 - 2024. All rights reserved.