0

我有一個從BaseSwitchesController繼承的用於json的SwitchesController。Rails 4 - 控制器使用超級控制器的視圖路徑

module Api 
    module V1 
    class SwitchesController < BaseSwitchesController 
     respond_to :json 
    end 
    end 
end 

我有另一個SwitchesController,也繼承自BaseSwitchesController,爲html。

class SwitchesController < BaseSwitchesController 
    layout 'application' 
end 

BaseSwitchesController繼承自ApplicationController。

class BaseSwitchesController < ApplicationController 
    def update 
    respond_to do |format| 
    if @switch.update(switch_params) 
     format.html { redirect_to @switch, notice: 'Switch was successfully updated.' } 
     format.json { render json: @switch.as_json.merge(:message => 'set_switch_value') } 
    else 
     format.html { render action: 'edit' } 
     format.json { render json: @switch.errors, status: :unprocessable_entity } 
    end 
    end 
end 

我想將json移動到API模塊中的SwitchesController。 問題是SwitchesController中的方法正在查看views/base_switches中的視圖,但該文件夾不存在。它應該在視圖/開關中查找視圖,並選擇index.json.rabl。

我該如何解決這個問題?謝謝!

+0

你在BaseSwitchesController中硬編碼渲染或重定向路徑嗎?告訴我們你的BaseSwitchesController – usha 2014-08-28 12:15:53

+0

我對這個問題做了一些改變。 – hansottowirtz 2014-08-28 12:25:50

+0

我希望Rails在視圖/開關中查看views/base_switches **和**中的視圖(但不按此順序)。這就是模板繼承的工作原理。 – pdobb 2014-08-28 13:14:25

回答

1

我不會親自將API控制器與HTML控制器混合在一起。

我發現兩種情況是標準的。

  1. 你沒有一個傳統的API(與它自己的寧靜路線,版本等)以及HTML和JSON響應。在這種情況下,您可以使用url上的.format擴展名或使用請求標頭來訪問格式。這兩種格式使用相同的視圖

  2. 你確實有一個獨立的API,在這種情況下你不會混合視圖在一起,它允許你使用ActiveRecordSerializers,Rabl或你想要使用的任何模板方法。

此外,你的例子不利於子類。子類應該是你的超類的專業​​化,並且應該包含與其他子類相區別的東西。你的超類包含來自兩個子類的專門行爲。因爲我假設你不想回應你的API控制器之外的json。 希望這可以幫到你

+0

謝謝你的回答。我最大的問題是我正在複製大部分代碼(所以不太乾)。你有什麼想法我可以解決這個問題嗎?我想將專門的行爲移到子類中,所以超類中的代碼只是api和html控制器都會使用的代碼。只是想知道你的意見。 – hansottowirtz 2014-08-28 13:32:49

+0

我明白你的觀點。就我個人而言,我會忍受這種小的重複,但主要是出於一個原因:獨立性。那就是如果你想要的話。在你的例子中,沒有太多的重複,因爲你可以在一箇中渲染json,並在另一個控制器中渲染html,幾乎沒有重複。你也可以把它們放在一起,至少在這種情況下也是如此。例如,當我願意讓這兩個響應不同並且允許不同類型的安全性時,我會費心製作一個API。 – 2014-08-28 13:39:58

相關問題