Ruby on rails 如何避免未定义的方法'id';对于ActiveRecord\u关系?

Ruby on rails 如何避免未定义的方法'id';对于ActiveRecord\u关系?,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,希望这不是一个重复的问题,因为我花了数周时间寻找答案,但还没有找到解决问题的方法 我有一个RubyonRailsAPI(Ruby1.9.3,Rails4.0.0),我正在使用ActiveRecord与我们的数据库交互。当请求检索当前计划的横幅时,它可以正常工作。但是,如果没有计划任何横幅,则会出现500响应: undefined method `id' for #\u003cBanner::ActiveRecord_Relation:0x0000000628fba8\u003 我的理解是,这是

希望这不是一个重复的问题,因为我花了数周时间寻找答案,但还没有找到解决问题的方法

我有一个RubyonRailsAPI(Ruby1.9.3,Rails4.0.0),我正在使用ActiveRecord与我们的数据库交互。当请求检索当前计划的横幅时,它可以正常工作。但是,如果没有计划任何横幅,则会出现500响应:

undefined method `id' for #\u003cBanner::ActiveRecord_Relation:0x0000000628fba8\u003
我的理解是,这是因为在“nil”上尝试了一个固有的“id”方法,该“nil”是在没有找到符合条件的记录时数据库查找的结果。我如何优雅地处理这个场景,这样就不会遇到500错误,并且可以向请求者返回更礼貌的响应

这是我的控制器:

class BannersController < ApplicationController
  load_and_authorize_resource

  respond_to :json

  # Look to see if any banners should be showing right now
  def current
    @banner = Banner.current
  end
end
数据库表“Banner”的主键为“BannerID”

感谢所有愿意花时间调查此事的人。我花了数不清的时间阅读和尝试一切,以纠正这种情况,但没有任何效果

\u003cBanner::ActiveRecord\u关系的未定义方法“id”:0x0000000628fba8\u003

数据库表“Banner”的主键为“BannerID”

然后乳清还在使用
:id
still!。改变

json.extract! @banner, :id, :banner_html, :banner_image, :hidden_text, :hidden_background_color

小注:

按照惯例,属性应该在
snake\u案例中

为什么不

if !@banner.blank?
  json.extract...
  ...
else
  json.null!
  (or whatever you want?)
end

尝试在
json.extract中将
:id
更改为
:banner\u id
line什么是
ActiveRecord\u关系
?非常感谢您的帮助!我是Ruby的新手,你的帮助是我的救星。当我做出您建议的更改时,我现在得到以下响应:
未定义的#\u003cBanner::ActiveRecord\u关系的方法'BannerID'
@RavingHermit表中的字段名是什么?是
BannerID
还是
banner\u id
?表字段在数据库中是BannerID。我闻到你在做什么,我很喜欢。不幸的是,我仍然得到相同的错误:
未定义的#\u003cBanner::ActiveRecord_关系的方法'id':0x00000007134640\u003e
这是我的更新视图:
如果@横幅,空白?json.extract@横幅,:id,:banner\u html,:banner\u图像,:hidden\u文本,:hidden\u背景颜色json.request\u id request.uuid else json.null!end
另一种处理它的方法(实际上可能更好)是使用一个model.method,返回一个“default”不可用的横幅,并在控制器中选中:
@banner=banner.current,就像您所做的一样,但后面跟着@banner=banner.default,除非@banner
json.extract! @banner, :id, :banner_html, :banner_image, :hidden_text, :hidden_background_color
json.extract! @banner, :BannerID, :banner_html, :banner_image, :hidden_text, :hidden_background_color
if !@banner.blank?
  json.extract...
  ...
else
  json.null!
  (or whatever you want?)
end