2013-11-20 65 views
5

我們在Rails應用程序中使用active_model_serializers - 0.8.1如何禁用特定控制器的ActiveModel :: Serializer?

該應用程序有一些API特定的控制器繼承自ActionController :: Metal,其方式類似於rails-apiActionController::API

那麼我們只想爲上面提到的API控制器使用ActiveModel :: Serializer。
這可能嗎,怎麼樣?

注:

render :json => @your_object.to_json

我們正在尋求一個更優雅的解決方案:
正如documentation使用串行提到可以明確地通過更換

render :json

避免比上面的要多。
謝謝。

+0

可不可以給一個代碼示例,說明你的目標是什麼呢?我認爲這將有助於大大澄清你的問題。 – Davidann

+0

@Davidann我們希望能夠通過選項將active_model_serializers的控制器列入白名單。 –

回答

1

我不知道是否有一個優雅的解決方案。它看起來像你必須monkeypatch ActionController :: Serialization - https://github.com/rails-api/active_model_serializers/blob/5a92e00b51927c9c0e7c90f92c825aff09314bfd/lib/action_controller/serialization.rb

最小的變化可能是通過覆蓋build_json_serializer方法並在不想使用ActiveModelSerializers的控制器中返回nil。如果控制器中的build_json_serializer總是返回零,那麼行爲應該默認爲非AMS序列化

不幸的是,這個類似乎沒有很好的修改結構(私有方法等),因此您可能想提交一個拉請求讓你的任務更輕鬆。在包含AMS之前保留「原始」_render_option_json方法的別名,使build_json_serializer受保護而不是私有,或者添加配置選項以基於每個控制器禁用AMS都將是合理的修改。

2

我有一個問題,也需要禁用序列化,所以我創建了this pull request,通過在控制器中調用disable_serialization來增加在特定控制器中禁用序列化的功能。

5

你也可以這樣做:

respond_with @your_object, serializer: nil 
4

您可以覆蓋一個控制器上的default_serializer_options方法來禁用序列化器在控制器的所有動作。

def default_serializer_options 
    { 
    serializer: nil 
    } 
end 

我們目前正在產生我們在其他方面JSON,但我想調查ActiveModel::Serializers特定資源。這是當我發現添加寶石意味着所有控制器將嘗試使用串行器。不僅僅是我想要測試方法的那個。

默認情況下使用序列化程序很有前途,但我們需要一些時間將現有控制器轉換爲此方法。我更新了其他現有的控制器,不使用序列化器(使用上述方法),因此我可以在逐控制器的基礎上添加序列化器。

0

只是提出了@ dbj的答案,雖然正確,但由於respond_with被移動的事實,在Rails4中將不起作用。

NoMethodError: The respond_with feature has been extracted to the responders gem. Add it to your Gemfile to continue using this feature: gem 'responders', '~> 2.0' Consult the Rails upgrade guide for details.

簡單的修復,通過猜測果然發現,當時只是做:

render json: @you_object, serializer: nil

相關問題