うまくいけば、これは重複した質問ではない、私は答えのためにStackOverflowを精練し、私の問題の解決策を見つけていない。ActiveRecord_Relationの未定義メソッド `id 'を避けるには?
私はRuby on Rails API(Ruby 1.9.3、Rails 4.0.0)を持っており、ActiveRecordを使って私たちのデータベースとやり取りしています。現在スケジュールされているバナーを取得する要求が行われると、完全に機能します。何のバナーが予定されていない場合は、しかし、500応答が経験している:
undefined method `id' for #\u003cBanner::ActiveRecord_Relation:0x0000000628fba8\u003
私の理解では、固有の「ID」メソッドはデータベース検索からの結果である「ゼロ」時に試みられているためであるということです適格なレコードが見つからないとき。このシナリオを正常に処理して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
は私のモデルである:
class Banner < ActiveRecord::Base
self.table_name = 'Banner'
self.primary_key = :BannerID
alias_attribute :name, :FriendlyName
alias_attribute :banner_html, :BannerHtml
alias_attribute :banner_image, :BannerImage
alias_attribute :start_date, :StartDate
alias_attribute :end_date, :EndDate
alias_attribute :is_active, :IsActive
alias_attribute :is_removed, :IsRemoved
alias_attribute :start_date_time, :StartDateTime
alias_attribute :end_date_time, :EndDateTime
alias_attribute :hidden_text, :HiddenText
alias_attribute :hidden_background_color, :HiddenBackgroundColor
# This returns nil if no banner is scheduled, which then causes the view to return a 500 response because it tries to invoke an "id" method
scope :current, -> { Banner.where("StartDateTime <= ? AND EndDateTime >= ? AND IsActive=1 AND IsRemoved=0 AND BannerType=1", Time.now.to_s(:db), Time.now.to_s(:db)).first }
end
注:私は.find_byを使用してみましたし、また、1次回使用していないしようとしたが、まだ見つけることができないようしていますこれに対する解決策。ここで
が私の見解です:
json.extract! @banner, :id, :banner_html, :banner_image, :hidden_text, :hidden_background_color
json.request_id request.uuid
データベーステーブル "バナー" "BannerID" の主キーを持っています。
これを調べる時間がかかるすべての人に感謝します。私は状況を改善するために何も読まずにすべてを試して無尽蔵に時間を過ごしました。
'変更してみません:id'は'に!json.extract 'でbanner_id''ライン – Pavan
'ActiveRecord_Relation'は何ですか? – engineersmnky