Ruby Rails MoviesController#index出现NoMethodError:电影分类排序问题
修复电影列表分类筛选的NoMethodError问题
看起来你这段代码里有两个关键问题导致了NoMethodError,咱们一步步来修复:
1. 排序语法错误
你写的:
@movies = Movie.where(:category_id => @category_id).("created_at DESC")
这里的.(...)是完全错误的语法,Rails中查询排序需要用order方法。可以改成两种更规范的写法之一:
# 字符串形式 @movies = Movie.where(category_id: @category_id).order("created_at DESC") # 更符合Rails风格的哈希形式 @movies = Movie.where(category_id: @category_id).order(created_at: :desc)
2. 处理分类不存在的边界情况
当params[:category]传入的分类名称在数据库中不存在时,Category.find_by(name: params[:category])会返回nil,这时候调用.id就会触发NoMethodError(因为NilClass没有id方法)。咱们可以加个判断来避免这种情况:
if params[:category].present? category = Category.find_by(name: params[:category]) if category.present? # 利用关联查询更简洁 @movies = category.movies.order(created_at: :desc) else # 分类不存在时的处理,比如返回所有电影 @movies = Movie.order(created_at: :desc) end else # 没有传入分类参数时,返回所有电影 @movies = Movie.order(created_at: :desc) end
这样调整之后,既修复了语法错误,又处理了分类不存在的异常情况,应该就能解决你遇到的NoMethodError了。
内容的提问来源于stack exchange,提问作者SapphireJones
相关产品推荐
相关产品推荐

