2017-06-25 43 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嘗試和也嘗試不使用。第一,但似乎仍不能找到對此的解決方案。

這是我的觀點:

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仍然!更改

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 

小記:

按照慣例,屬性應該是snake_case

+1

非常感謝您的幫助!我是Ruby的新手,你的幫助是一個救星。當我提出你所做的改變時,我現在得到了這樣的回答:'#define'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

我聞到你在做什麼,我喜歡它。不幸的是,我還是得到了同樣的錯誤:'#undefined method'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 like you除了@ banner'之外,還有@banner = Banner.default –

相關問題