2017-06-25 13 views
3

うまくいけば、これは重複した質問ではない、私は答えのために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" の主キーを持っています。

これを調べる時間がかかるすべての人に感謝します。私は状況を改善するために何も読まずにすべてを試して無尽蔵に時間を過ごしました。

+0

'変更してみません:id'は'に!json.extract 'でbanner_id''ライン – Pavan

+0

'ActiveRecord_Relation'は何ですか? – engineersmnky

答えて

1

undefined method `id' for \u003cBanner::ActiveRecord_Relation:0x0000000628fba8\u003

The database table "Banner" has a primary key of "BannerID"

次にホエーはまだ:id!を使用しています。慣例により

は、属性がsnake_caseにする必要があります:

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 

に小さなノートを変更します。

+1

ありがとうございました!私はRubyが初めてで、あなたの助けが命を救う人です。私があなたが提案した変更を行ったとき、私は今この応答を得ます: '未定義のメソッド 'BannerID for#\ u003cBanner :: ActiveRecord_Relation' – RavingHermit

+0

@RavingHermitテーブルのフィールド名は何ですか?それは 'BannerID'か' banner_id'ですか? – Pavan

+0

テーブルフィールドは、データベースのBannerIDです。 – RavingHermit

0

なぜあなたはちょうど

if [email protected]? 
    json.extract... 
    ... 
else 
    json.null! 
    (or whatever you want?) 
end 
+0

私はあなたが料理しているものを嗅ぎ、私はそれが好きです。残念ながら、私はまだ同じエラーが発生します: '未定義のメソッド 'id' for#\ u003cBanner :: ActiveRecord_Relation:0x00000007134640 \ u003e' – RavingHermit

+0

これは私の更新されたビューです:' if [email protected]? json.extract! @ banner、:id、:banner_html、:banner_image、:hidden_​​text、:hidden_​​background_color json.request_idリクエスト。uuid else json.null! end' – RavingHermit

+0

これを処理する別の方法は、実際にはもっと良いかもしれませんが、デフォルトでは使用できないバナーを返すmodel.methodを持ち、コントローラーのチェックで '@banner = Banner.current you like @ banner = Banner.defaultがなければ@ banner' –

関連する問題