2013-12-07 26 views
0

我現在使用RABL在Rails中生成API的JSON響應,但是我發現雖然RABL對於將模型映射到響應非常方便,但要創建一致的API,我必須複製該映射邏輯在我的控制器的updatecreate功能。使用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_idbadly_named_legacy_column_that_means_color。不是很乾。

到目前爲止,我還沒有遇到任何方式來處理這個使用RABL。有沒有我想念的東西?我也意識到這可能超出了RABL的範圍,RABL專門將其自身定義爲模板系統,所以也許還有另一個API生成器允許我這樣做?我喜歡將凌亂的數據庫列映射到一個乾淨的API,但必須在視圖和控制器中指定這個映射不是非常乾燥。任何想法讚賞。

回答

1

更新

原來答案是所有的Ruby/Rails => JSON,問題是JSON =>的Ruby/Rails。 This answer about associating columns應該解釋的方法:

alias_attribute :new_column_name, :column_name_in_db 

然後,你可以參考new_column_name在Rabl的和Rails將處理在創建/更新的關聯。


您應該能夠從create方法調用render和渲染任何視圖。您可以使用create特定模板自定義響應,也可以重新使用通用show模板。訣竅是(在這種情況下app/views/car/car.rabl)重新使用對象Rabl的模板,例如:

# POST /cars 
    def create 
    @car = Car.new(params) 

    if @car.save 
     render action: 'show' 
    else 
     respond_with @car 
    end 
    end 

哪裏app/views/cars/car.rabl

attributes :id, ... 

app/views/cars/show.rabl

object @car 

extends "cars/car" 
+0

很抱歉,如果我並不清楚,但這並不是我所要求的 - 我不關心如何將回覆呈現給帖子,我知道該怎麼做。我調整了這個問題,以引起更多關注重要的部分:按照我在上面的結果做的方式,在兩個地方我必須將DB列名映射到API屬性名稱,而且我寧願只做一次映射。理想情況下,我可以利用RABL模板中的知識,但我願意接受其他方法。 –

+0

會將映射放在'car.rabl'中嗎?您可以只做一次映射,然後從不同的操作中引用該文件。它基本上是對象的一部分。 – phillbaker

+0

問題不在於複製多個RABL模板中的映射。它複製了模板和控制器中的映射 - 必須在模板中執行database_column - > api_property,然後在控制器的創建操作中執行api_property - > database_column。 –

相關問題