麻烦在Rails博客中创建和显示用户

时间:2014-06-02 20:12:09

标签: ruby-on-rails ruby blogs

在我尝试创建的简单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

3 个答案:

答案 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_userlogged_in?不是设置用户实例的方法的好名称,因为人们会期望以问号结尾的方法将返回truefalse。而不是用户实例。

此外,设置当前用户通常使用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