2010-04-30 77 views
20

我在對象上使用了to_json方法,並試圖讓:methods參數起作用。我在我的模型(Drop)上有一個名爲is_favorited_by_user?的方法。此方法採用current_user的參數,然後檢查用戶是否傾向於放棄該放置。我如何通過to_json方法傳遞這個參數。Ruby to_json:方法參數

render :json => @drops.to_json(:methods => :is_favorited_by_user?(current_user)) 

回答

36

您可以添加current_user屬性到模型和執行to_json

attr_accessor :current_user 

    def is_favorited_by_user?(user=nil) 
    user ||= current_user 
    # rest of your code 
    end 


@drops.current_user = current_user 
render :json => @drops.to_json(:methods => :is_favorited_by_user?) 
+0

工作!謝謝,Voyta! – 2010-04-30 16:01:31

+4

當我在索引操作中執行render:json => Drop.all時,如何擴展此解決方案。我在哪裏分配current_user? – 2011-06-01 16:34:41

+3

模型中的'cattr_accessor:current_user'然後控制器中的'Model.current_user = current_user'。 – 2013-06-01 19:39:03

4

方法to_json需要的並非是帶參數的,但只是「消氣」的方法。 (通常情況下,那些創建基於你的數據庫的屬性。)

見的例子在這裏,沒有傳遞參數:

http://apidock.com/rails/ActiveRecord/Serialization/to_json

如果你想要做的事的習慣,你需要創建一個方法建立您想要的信息的散列,然後將該散列轉換爲json。

+1

有沒有一種方法,我可以在我的模型中得到CURRENT_USER變量之前設置它,所以我並不需要通過論證? – 2010-04-30 15:35:06

+0

@JamesFinley模型不(也不應該)知道控制器或http請求的狀態。 current_user是請求的一部分,由於上述多線程問題,不應以全局方式暴露給模型。它只應作爲方法參數傳遞。 – hammady 2016-10-19 07:39:12