3

我正在尝试在 Rails 上运行一个应用程序,用于 saas 课程,作业 2。每当我刷新页面时,都会出现以下错误:

NoMethodError in MoviesController#index

undefined method `keys' for nil:NilClass
Rails.root: C:/Sites/RailsProjects/hw2_rottenpotatoes

Application Trace | Framework Trace | Full Trace
app/controllers/movies_controller.rb:24:in `block in index'
app/controllers/movies_controller.rb:23:in `each'
app/controllers/movies_controller.rb:23:in `index'

我的movies_controller.rb文件:

class MoviesController < ApplicationController

  def show
    id = params[:id] # retrieve movie ID from URI route
    @movie = Movie.find(id) # look up movie by unique ID
  end

  def index
    redirect = false

    if params[:sort]
      @sorting = params[:sort]
    elsif session[:sort]
      @sorting = session[:sort]
      redirect = true
    end

    if redirect
      redirect_to movies_path(:sort => @sorting, :ratings => @ratings)
    end

    Movie.find(:all, :order => @sorting ? @sorting : :id).each do |mv|
      if @ratings.keys.include? mv[:rating]
        (@movies ||= [ ]) << mv
      end
    end

    session[:sort] = @sorting
    session[:ratings] = @ratings
  end

  def new
      # default: render 'new' template
  end

  def create
    @movie = Movie.create!(params[:movie])
    flash[:notice] = "#{@movie.title} was successfully created."
    redirect_to movies_path
  end

  def edit
    @movie = Movie.find params[:id]
  end

  def update
    @movie = Movie.find params[:id]
    @movie.update_attributes!(params[:movie])
    flash[:notice] = "#{@movie.title} was successfully updated."
    redirect_to movie_path(@movie)
  end

  def destroy
    @movie = Movie.find(params[:id])
    @movie.destroy
    flash[:notice] = "Movie '#{@movie.title}' deleted."
    redirect_to movies_path
  end

end

我对 Rails 非常陌生,并且只在这一点上停留了 4 个小时来尝试不同的东西。

4

1 回答 1

14

让我们来看看那个错误信息......

undefined method `keys' for nil:NilClass

这有三个重要的部分:

  1. undefined method- 这告诉你核心问题。问题是您尝试调用的方法对于您尝试调用它的事物不存在。
  2. keys- 这告诉你你试图调用的方法。
  3. nil:NilClass- 这告诉你你在调用这个方法。在您的情况下,这一点信息并没有直接帮助 - 它并没有告诉您确切地寻找什么。但是,它告诉您,您要查找的任何内容的值都是nil.

Rails.root: C:/Sites/RailsProjects/hw2_rottenpotatoes

这是告诉你项目的根源,以防你完全忘记了你正在做什么。没关系。我们都有这样的日子。

Application Trace | Framework Trace | Full Trace
app/controllers/movies_controller.rb:24:in `block in index'
app/controllers/movies_controller.rb:23:in `each'
app/controllers/movies_controller.rb:23:in `index'

这准确地告诉您哪里寻找您遇到的错误。它就在第二行:app/controllers/movies_controller.rb:24... File movies_controller.rb, line 24

它可能指的是这一行:

if @ratings.keys.include? mv[:rating]

您正在检查是否mv[:rating]@ratings.keys... 但是您得到的错误是告诉您您正在检查keyson nil。这意味着@ratings尚未设置。

因此,看起来您只需要@ratings在该操作顶部附近的某个位置进行设置index

于 2013-08-02T20:50:43.690 回答