我現在使用RABL在Rails中生成API的JSON響應,但是我發現雖然RABL對於將模型映射到響應非常方便,但要創建一致的API,我必須複製該映射邏輯在我的控制器的update
和create
功能。使用RABL(或其他API生成器)來處理模型創建/更新?
舉個簡單的例子,如果我只是想改變的響應POST請求的屬性名,我可以在Rabl的做到這一點:
create.rabl
object @car
attributes car_id: :id, badly_named_legacy_column_that_means_color: :color
但如果我希望客戶端能夠在JSON POST/PUT請求本身中使用這些相同的「清理」屬性(即能夠發送{ "id": 1, "color": "red" }
而不是{ "car_id": 1, "badly_named_legacy_column_that_means_color": "red" }
),我必須在控制器中再次手動執行此映射:
cars_controller.rb
def create
params[:car_id] = params.delete(:id)
params[:badly_named_legacy_column_that_means_color] = params.delete(:color)
@car = Car.create(params)
end
現在有兩個地方,我需要映射到car_id
badly_named_legacy_column_that_means_color
。不是很乾。
到目前爲止,我還沒有遇到任何方式來處理這個使用RABL。有沒有我想念的東西?我也意識到這可能超出了RABL的範圍,RABL專門將其自身定義爲模板系統,所以也許還有另一個API生成器允許我這樣做?我喜歡將凌亂的數據庫列映射到一個乾淨的API,但必須在視圖和控制器中指定這個映射不是非常乾燥。任何想法讚賞。
很抱歉,如果我並不清楚,但這並不是我所要求的 - 我不關心如何將回覆呈現給帖子,我知道該怎麼做。我調整了這個問題,以引起更多關注重要的部分:按照我在上面的結果做的方式,在兩個地方我必須將DB列名映射到API屬性名稱,而且我寧願只做一次映射。理想情況下,我可以利用RABL模板中的知識,但我願意接受其他方法。 –
會將映射放在'car.rabl'中嗎?您可以只做一次映射,然後從不同的操作中引用該文件。它基本上是對象的一部分。 – phillbaker
問題不在於複製多個RABL模板中的映射。它複製了模板和控制器中的映射 - 必須在模板中執行database_column - > api_property,然後在控制器的創建操作中執行api_property - > database_column。 –