在生产环境中,POST登录路由无法正常工作

5
我是一名新手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

Sessions#new

<%= 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个回答

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
@AkashPinnaka:你希望我对此回复什么?“太糟糕了”? - Sergio Tulentsev
不,正如您发布的那样,它显示相同的表单,但实际上并不是。相反,它会抛出一个错误 :) 谢谢您的答案。您的答案帮助我更好地前进。 - Akash Pinnaka
看起来你不需要/想要我的帮助来处理这个错误。那么祝你好运,先生 :) - Sergio Tulentsev

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_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命令的建议!


谢谢,我从你的回答中学会了如何为路由设置名称。 - Akash Pinnaka
如何同时分配多个资源 :) - Richard Peck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接