我是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 %>
答案 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
值得@Sergio
对render :new
命令的建议!