2014-09-18 61 views
1

葡萄有沒有一種方法& Grape-Entity將數據自動序列化爲實體?好像所有的例子都使用PARAMS [:VAR(來源:https://github.com/intridea/grape將有效載荷序列化到葡萄實體上post/put

desc "Create a status." 
params do 
    requires :status, type: String, desc: "Your status." 
end 
post do 
    authenticate! 
    Status.create!({ 
    user: current_user, 
    text: params[:status] 
    }) 
end 

當發佈實體是更復雜的(可以說一個新的人(名字,姓氏,地址等),是否有一種能夠自動把它變成該API表示實體尋找某種用法是這樣的:???

post do 
    authenticate! 
    entity.first_name 
    entity.last_name 
end 
+0

作爲一個推論,我如何才能使實體上的屬性允許的參數 – Prescott 2014-09-18 18:37:19

回答

0

是您的實體ActiveRecord模型如果是這樣,也許MyModel.new(params)或者更好的,你可以只允許聲明參數如下:MyModel.new(declared(params))。請參閱the doc here

Ruby有很多元編程的強大功能,可以讓你自己做你想做的事情,而不是那麼痛苦,像元編程這樣的事情,你可以循環使用params並設置實體的字段。 然而,,你想要做的事實際上是複雜的,這就是爲什麼沒有通用的解決方案。想象一下,如果你在你的實體中嵌入了深層次的關聯。我認爲典型的建議是接受這樣一個事實,即通過API提供的內容(以及您回饋的內容)是對事物的表示,而不是事物本身。在此之後,如果通過的內容已經代表現有的事情,那麼這個事情可能是由一個ID代表的?如果你的API需要一個ID,那麼你只需要看看這個東西。這是在使用Sidekiq之類的東西時給出的建議:以後要處理數據庫中的某些數據時,您需要捕獲數據庫記錄的ID,而不是所有數據本身。這在數據在此期間發生變化的情況下具有優勢,但這裏的重點在於,如果您的API接受指向您可以加載的指針,您可能會從中受益。

我會說你想要的最好用例是你的實體是複雜的,你說的是你的情況。考慮讓你的實體不那麼複雜。


由於片段:你可能想看看grape-entity,但我認爲這是一種你想要的逆的,因爲我覺得(我沒有用它自己,和文檔ISN對我的高級目的不是很清楚),它意味着與您的實體一起工作,以響應響應