在我尝试创建的简单Rails博客中尝试创建和显示错误时,我一直遇到各种错误。让我知道如果您看到任何明显的内容,或者您是否需要我发布更多代码,因为我和已经尝试了很多东西,但无济于事。感谢
浏览器给我这个错误
无法找到没有ID的用户
在我的" logged_in?"显示的方法
def logged_in?
@current_user ||= User.find(session[:user_id])
end
会话控制器
class SessionsController < ApplicationController
def new
end
def create
user = User.find_by(email: params[:email])
if user && user.authenticate(params[:password])
session[:user_id] = user.id
flash[:success] = "You are logged in"
redirect_to root_path
else
render action: 'new'
flash[:error] = "There was a problem logging in. Please check your email and password"
end
end
end
def index
@users = User.all
end
def show
end
def new
@user = User.new
end
def edit
end
def create
@user = User.new(user_params)
if @user.save
session[:user_id] = @user.id
flash[:notice] = "You have registered, please login"
redirect_to login_path
else
render :new
end
end
def update
respond_to do |format|
if @user.update(user_params)
format.html { redirect_to @user, notice: 'User was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
def destroy
@user.destroy
respond_to do |format|
format.html { redirect_to users_url }
format.json { head :no_content }
end
end
private
def set_user
@user = User.find(params[:id])
end
def user_params
params.require(:user).permit(:first_name, :last_name, :email, :password, :password_confirmation)
end
end
文章控制器
class ArticlesController < ApplicationController
http_basic_authenticate_with name: "dhh", password: "secret", except: [:index, :show]
def new
@article = Article.new
end
def index
@article = Article.all
end
def create
@article = Article.new(article_params)
if @article.save
redirect_to @article
else
render 'new'
end
end
def edit
@article = Article.find(params[:id])
end
def update
@article = Article.find(params[:id])
if @article.update(article_params)
redirect_to @article
else
render 'edit'
end
end
def show
@article = Article.find(params[:id])
end
def destroy
@article = Article.find(params[:id])
@article.destroy
redirect_to articles_path
end
private
def article_params
params.require(:article).permit(:title, :text, :image)
end
end
应用程序助手
module ApplicationHelper
def logged_in?
@current_user ||= User.find(session[:user_id])
end
end
答案 0 :(得分:1)
虽然用户未进行日志记录,但session[:user_id]
为零,因此User.find(session[:user_id])
会生成错误。方法应该是这样的:
def logged_in?
@current_user ||= User.find(session[:user_id]) if session[:user_id].present?
end
答案 1 :(得分:1)
您遇到的问题是session[:user_id]
是nil
。通常,设置当前用户的方法称为current_user
。 logged_in?
不是设置用户实例的方法的好名称,因为人们会期望以问号结尾的方法将返回true
或false
。而不是用户实例。
此外,设置当前用户通常使用before_filter
。此外,您希望在设置当前用户的操作中跳过此before filter(即current_user尚不存在)
最后,如果找不到用户,我宁愿优雅地失败。您可以通过将代码更改为User.find_by_id(session[:user_id])
答案 2 :(得分:0)
为什么logged_in?
辅助方法会尝试为@current_user?
赋值?我认为这是一个错误的逻辑,它应该只返回一个布尔结果而不修改这样的中心实例。这是一种正确的方法:
def logged_in?
@current_user.nil? ? false : true
end
设置@current_user
的责任落在一个方法中,您应该将其置于application_controller.rb
并使其成为before_action
,以便在触发任何控制器操作之前执行该方法,即:
# app/controllers/applicaton_controller.rb
class ApplicationController < ActionController::Base
protect_from_forgery
before_action :authenticate_user
# Your actions here
..
..
#
private
def authenticate_user
@current_user ||= User.find(session[:user_id]) if session[:user_id].present?
end
end