我的问题实际上相当简单,我如何创建一个创建操作来检查用户是否已登录,以及她/他是否被重定向到仪表板,而不是呈现索引页面,他们有链接和东西去注册。还有为什么下面的代码不起作用。
类 用户控制器 <应用程序控制器>应用程序控制器>
def new
@user = User.new
end
def create
if current_user.nil?
redirect_to dplace_index_path
if current_user
@user = User.new(params[:user])
if @user.save
auto_login(@user)
redirect_to dplace_index_path
end
end
end
end
end
你的代码没有做你期望的事情,因为if语句实际上是嵌套的(你想要elsif
相同的结构 - 或者看到我下面建议的修复)。以下是您的代码在格式正确后的实际外观:
def create
if current_user.nil?
redirect_to dplace_index_path
if current_user
@user = User.new(params[:user])
if @user.save
auto_login(@user)
redirect_to dplace_index_path
end
end
end
end
从逻辑上讲,你永远不会进入第二个if
语句,因为必须current_user
nil
才能进入第一个语句。请尝试以下操作:
def create
if current_user
@user = User.new(params[:user])
if @user.save
auto_login(@user)
redirect_to dplace_index_path
end
else
redirect_to dplace_index_path
end
end
我重新排列了代码,但它在逻辑上应该做你现在想要的。我把"快乐路径"放在第一位(current_user
存在),并将重定向移动到 else 语句中。
常规用户身份验证:
def create
user = User.find_by_email(params[:email])
if user && user.authenticate(params[:password])
session[:user_id] = user.id
redirect_to dashboard_url, :notice => "Logged in!"
else
flash.now.alert = "Invalid email or password"
render "new"
end
end
尝试:
def create
if current_user.blank? # .blank? will check both blank and nil
# logic when user is not logged in
redirect_to index_path
else
# logic when user is logged in
redirect_to dashboard_path
end
end
def create
redirect_to dplace_index_path unless current_user
# no need to check current_user again
@user = User.new(params[:user])
if @user.save
auto_login(@user)
redirect_to dplace_index_path
end
end