2014-02-16 25 views
0

這是我在stackoverflow上的第一個問題。 我試圖搜索類似的,但迄今沒有發現任何東西。 另外,我是Ruby/Rails開發人員的新手,所以我可能完全缺少基本概念。有條件地引用實例變量Ruby/Rails

但讓我們來談談。
我的應用程序基本上是一個遊戲。在遊戲結束時,玩家是設計者登錄的用戶,顯示他得到的分數。
當玩家點擊「排名」按鈕時,該評分將通過JavaScript作爲顯示排名前5的「排名」頁面的URL中的查詢字符串發送到服務器。隨着比分發送剛剛結束的比賽的難度,所以排名將指示該難度等級。

所以我們調用了Pages控制器的「排名」動作。我想要做的是更新用戶的「max_score」,即檢查當前得分是否大於「max_score」屬性,並相應地更新屬性。由於我們有這三個不同的難度級別,因此用戶實際上擁有與最高分相關的屬性:max_easy,max_medium,max_hard,其中三個屬性。因此,我首先需要檢查哪三個屬性需要考慮,然後評估「大於」條件。
我決定在用戶​​模型中定義一個方法,該方法由Pages#排名調用。下面是代碼:

def update_max_score(diff,score) 

    @ref_score = self.max_easy if diff == "easy" 
    @ref_score = self.max_medium if diff == "medium" 
    @ref_score = self.max_hard if diff == "hard" 

    if score.to_i > @ref_score 
    @ref_score= score.to_i 
    end 
end 

但是實際的實例屬性沒有更新,甚至從控制檯調用該方法。 我發現迄今爲止獲得此方法的唯一方法是明確使用self.max_easy或self.max_medium,它本身不是邪惡的,但肯定意味着三次指示。

另外,我想知道,爲了將來的參考,這個分配有什麼問題:我只是無法得到它。

預先感謝您。

回答

1

要更新數據庫中的列,所以你應該使用ORM method

def update_max_score(diff, score) 
    update_attributes "max_#{diff}" => [send("max_#{diff}"), score.to_i].max 
end 
+0

這也適用於OP爲好,但'self'是多餘的。 – sawa

+0

得到了想法和語法,但ref_score屬性不存在。 試圖做 ref_score =「max _#{diff}」 但它仍然說ref_score不是屬性。 –

+0

不,數據庫中沒有ref_score列。我想要做的是在'ref_score'中輸入我想要更新的數據庫的名稱,然後更新它。 我曾經想過在Pages#中排名: 'current_user.update_max_score(params [:diff],params [:score]) current_user.save! ' 因此,update_max_score方法實際上不需要保存到DB ... 但是這樣就不再需要在Controller中顯式調用'save!'! 順便說一句,我找到了一種方法來讓它起作用: 'update_attributes(:「max _#{diff}」=> [send(「max _#{diff}」),score.to_i] .max)'' 這是偉大的,**如果安全**。 –