注销后登录 Rails 应用程序时遇到问题



这个社区看起来很棒。 我是轨道的新手,所以请忍受一些困惑。 我有一个允许新用户注册的应用程序。 用户与钱包对象一起创建,该对象获取与给定主键的用户匹配的外键。 当我单击注销时,我返回到预期的页面,但突然之间,我被抛出了一个"无效组合"错误......我觉得自从我引入current_user助手方法以来,它一直在抛弃一些东西。 这是我的文件片段

会话的控制器

class SessionsController < ApplicationController
skip_before_action :require_login, only: [:new, :create]

def new
end
def create
@user = User.find_by_email(params[:email])
if @user && @user.authenticate(params[:password])
session[:user_id] = user.id
redirect_to "/users/#{@user.id}"
else 
flash[:errors] = ["Invalid Combination"]
redirect_to "/sessions/new"
end
end
def destroy
session.delete(:user_id)
redirect_to "/sessions/new"
end
end 

用户的控制器

class UsersController < ApplicationController
skip_before_action :require_login, only: [:new, :create]
before_action :require_correct_user, only: [:edit, :show, :update, :destroy]
def new
end
def show
@user = User.includes(:wallet).find_by_id(params[:id])
end
def edit
end
def create
@user = User.create user_params 
@wallet = Wallet.new
@wallet.save
@user.wallet_id = @wallet.id
@wallet.user = @user
if @user.save && @wallet.save
session[:user_id] = @user.id
redirect_to "/users/#{@user.id}"
else
flash[:errors] = @user.errors.full_messages + @wallet.errors.full_messages
redirect_to "/sessions/new"
end
end
private
def require_correct_user
if current_user != User.find(params[:id])
redirect_to "/users/#{session[:user_id]}"
end
end

def user_params
params.require(:user).permit(:email, :motto, :bio, :first_name, 
:last_name, 
:password, :password_confirmation)
end
end

最后,这是我为新注册和现有用户登录(sessions#new)定向的视图。 请让我知道您在哪里看到任何潜在的打嗝!谢谢!

<nav>
<div class="nav-wrapper">
<a href="#" class="brand-logo center">
<%=image_tag("straightupLogoSiteHome.png")%></a>
<ul id="nav-mobile" class="left hide-on-med-and-down">
</ul>
<ul id="nav-mobile" class="right hide-on-med-and-down">
</ul>
<ul class="side-nav" id="mobile-demo">
</ul>
</div>
</nav>
<div class="container">
<br><br>
<div class="row">
<h3 class="center light">SIMPLE P2P BETTING</h3>
<br><br><br>
<div class="col s5 push-s7">
<H5 class="light">OR PLEASE... JOIN US</H5>
<form action="/users" method="post">
<input type="hidden" name="authenticity_token" value="<%= form_authenticity_token %>">
<div class="input-field col s12">
<input type="text" id="Email" name = "user[email]">
<label for="Email">EMAIL</label>
</div>
<div class="input-field col s12">
<input type="text" id="Motto" name = "user[motto]">
<label for="Motto">YOUR MOTTO (OPTIONAL)</label>
</div>
<div class="input-field col s12">
<input type="text" id="Bio" name = "user[bio]">
<label for="Bio">A BIO (OPTIONAL)</label>
</div>
<div class="input-field col s6">
<input type="text" id="First_Name" name = "user[first_name]">
<label for="First_Name">FIRST NAME</label>
</div>
<div class="input-field col s6">
<input type="text" id="Last_Name" name = "user[last_name]">
<label for="Last_Name">HOUSE NAME</label>
</div>
<div class="input-field col s6">
<input type="text" id="Password" name = "user[password]">
<label for="Password">PASSWORD</label>
</div>
<div class="input-field col s6">
<input type="text" id="Password_Confirmation" name = "user[password_confirmation]">
<label for="Password_Confirmation">AND AGAIN!</label>
</div>
<a class="waves-effect waves-light btn"><input type="submit" name="Join" value="JOIN US"></a>
</form>
</div>
<div class="col s4 pull-s4">
<H5 class="light">LOG BACK IN. sorry...</H5>
<form action="/sessions" method="post">
<input type="hidden" name="authenticity_token" value="<%= 
form_authenticity_token %>">
<div class="input-field col s12">
<input type="text" id="Email" name = "user[email]">
<label for="Email">EMAIL</label>
</div>
<div class="input-field col s12">
<input type="text" id="Password" name = "user[password]">
<label for="Password">PASSWORD</label>
</div>
<a class="waves-effect waves-light btn"><input type="submit" name="login" value="Login"></a>
</form>
</div>
</div>
</div>

道歉。current_user在下面的applications_controller中定义。 谢谢!

class ApplicationController < ActionController::Base
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
helper_method :current_user
def authorize
redirect_to "/sessions/new" unless current_user
end
end

好的。 问题就在这里...我收到的答案是一种解决方法,这根本不是我在学习时所需要的。 因此,在我的sessions_controller中,我通过users_controller中为用户指定的参数来定义用户。 我需要做的是在sessions_controller中定义login_params。要么是那个,要么是在创建方法.find_by_email(参数[user.email])中。 我选择在底部创建这个私有方法并更改了 .find_by_email(params[:email])和身份验证(params[:p assword]) 自 .find_by_email(login_params[:电子邮件])和身份验证(login_params[:p assword])

private
def login_params
params.require(:user).permit(:email, :password)
end

最新更新