2013-10-11 11 views
0

我有一個單例資源,需要#show上的外鍵。因此,我需要通過URL http://example.com/product/dash?uid=abcd訪問它,其中的用戶abcd屬於外部資源。Rails - 在控制器參數中需要外鍵

下面是我對類:

class SingletonController < ApplicationController 
    # this method requires a valid uid param 
    def show 
    params.require(:uid) 
    @user = User.find_by :id => params[:uid] 
    end 
end 

我試圖找到使用params.require從動作控制器的例子,但唯一的例子,我發現驗證的更新帕拉姆值,類似於@user.update_attributes!(user_attributes),其中user_attributes是調用params.require並驗證用戶對象實際存在的方法。我找不到一個在show方法中做到這一點的好方法。

什麼是Rails 4.0中檢查外部對象是否存在並拋出異常的最好方法?

+0

我不確定你在問什麼。你只需要一些會拋出異常的東西? '''User.find(params [:uid])'''如果對象不存在就會拋出異常。 – jcm

+0

我使用的外鍵不是外部對象的主鍵,所以我實際上在執行'User.find_by:key => params [:key]',並且不會引發異常。我上面的示例過於簡化。 –

+0

我只是想弄清楚這樣做的最好方法,並遵循Rails模型。很多時候我會寫一些半自定義的代碼來發現Rails中已經有了一個方法來完成我想要做的事情。 –

回答

0

http://apidock.com/rails/ActiveRecord/Base

有可能對動態查找器的末尾添加一個感嘆號(!),讓他們提高一個ActiveRecord :: RecordNotFound錯誤,如果他們不返回任何記錄,就像人.find_by_last_name!

所以儘量

User.find_by_key! params[:key] 

得到它拋出一個異常。另見the official API docsthe Active Record Query Interface Guide

編輯:相比於它的非爆炸對應

注意,在平原紅寶石爆炸裝置的方法是「危險」。通常(但不總是),這意味着該方法改變其接收器。像Rails這樣的框架可能有自己的約定(就像在這個答案中一樣)。如有疑問,請查看文檔。 :)

+0

啊!我不知道爆炸是怎麼回事。涼! –

+0

這是一個Rails約定。在Ruby中,它表明該方法將改變它所調用的方法。瞭解一些簡單的Ruby和Rails方法是非常重要的。 – jcm

相關問題