Ruby on Rails中NilClass调用each报错排查求助(Ruby2.2.9/Rails4.2.3)
解决Ruby on Rails中的NoMethodError(undefined method `each' for nil:NilClass)
这个错误的核心问题很明确:你的视图里调用@courses.each时,@courses是nil——也就是说Coursera.for(@search_term)没有返回预期的数组数据。咱们一步步排查修复:
1. 先修复模型里的明显语法错误
你的Coursera模型里这一行是完全错误的:
format :[enter image description here][1]json
这应该是你复制时的残留内容,HTTParty的format配置只需要指定格式类型,改成:
format :json
这个错误会导致HTTParty无法正确解析API返回的JSON响应,直接导致后续取["elements"]时得到nil。
2. 给API请求加容错处理
即使修复了格式问题,也可能因为API返回结构变化、网络故障或者参数错误,导致response["elements"]返回nil。咱们修改for方法,确保它始终返回一个数组(空数组也不会触发each的错误):
def self.for(term) response = get("", query: { query: term }) # 如果elements不存在,返回空数组兜底 response["elements"] || [] end
3. 调试确认API返回内容
可以在控制器里加一行调试代码,看看API实际返回了什么,方便进一步排查:
class CoursesController < ApplicationController def index @search_term = 'jhu' @courses = Coursera.for(@search_term) # 把结果打印到Rails日志里,查看log/development.log即可 logger.debug "Coursera API返回的courses数据: #{@courses.inspect}" end end
启动服务器访问页面后,打开日志文件就能看到@courses的真实值,判断是API没返回数据,还是返回结构和你预期的不一样。
4. 注意API版本问题
你使用的是旧版Coursera Catalog API(https://api.coursera.org/api/catalog.v1/courses),这个API大概率已经被官方废弃或更新了。如果前面的修复都做完还是拿不到数据,建议去Coursera开发者平台确认当前可用的API端点和请求参数规范。
内容的提问来源于stack exchange,提问作者Dohe
相关产品推荐
相关产品推荐

