2011-12-11 15 views
0

我一直在想這件事:我用ExtJS庫構建了一個單頁web應用程序。 整個GUI將通過AJAX請求使用JSON進行處理,所以我實際上從不使用視圖功能(除了主頁面,其中視圖是用於編寫基本標籤的六行)。我應該使用視圖渲染複雜的json數據,我需要視圖助手嗎?

但是,我遇到了一個我認爲會在我的應用程序中經常發生的問題:我有一個複雜的json,需要構建很多視圖助手,特別是引用其他資源(如圖像)。這些json對象是由我靜態編寫的,例如我需要配置ext來渲染一些類似桌面的圖標,這些圖標需要標題和對圖像的引用。我認爲這應該寫成一個視圖,其中params是包含標題/圖像的散列數組。

這就是說,我正在考慮一種方法,我的json對象將由視圖構建,而不是像我目前正在做的那樣由控制器構建。

我的問題是:

這種方法行嗎?當我嘗試在控制器中使用image_path helper時,我覺得自己違反了MVC模式。

重要的是要明白,我不是試圖在視圖中獲取某些東西,我只是將一些模型對象作爲參數傳遞給視圖並以json方式編寫它們。我不能(總是)使用.to_json方法,因爲有時我需要以完全不同的方式組織這些json對象。

編輯1:

我加入一個小問題,可能成爲這種方法非常有用:可以解析(控制器)在控制器中的YML.ERB文件,但允許它( yml)使用html.erb文件中所有那些好幫手?我想使用它們,因爲更好地在yml中構建一些靜態json對象而不是普通的json。如果是這樣的話,該怎麼做?記住我在一個控制器中。非常感謝。

回答

1

你可以很容易地直接在你的視圖模板中寫json,就像你會寫erb或者xml一樣。例如。如果你有這樣的

class FoosController < ApplicationController 
    def index 
    end 
end 

控制器和你接受你的路由格式,那麼你可以簡單地創建一個視圖

<% # app/views/foos/index.json.erb %> 
{ some_json_stuff: "<%= link_to 'home', root_url %>" } 

當您訪問/foos.json這種觀點將被渲染。這使您可以編寫任何自定義JSON與助手,部分等。

+0

你的答案是我的答案,我補充說,你也可以創建一個yourlayout.json.erb,它將被用來渲染json,如果你想以某種特殊的方式渲染它非常有用(例如所有的json請求在一個特殊的json中目的)。 –

1

你可能想看看Draper,這是一個爲Rails提供視圖模型的gem。對於像JSON視圖這樣的東西來說,它是理想的,這在模型中可能沒有地位。

它還允許您訪問助手和請求上下文。

class ArticleDecorator < ApplicationDecorator 
    decorates :article 

    def as_json(optsions={}) 
    { 
     :id  => model.id, 
     :foo => helpers.some_helper_method, 
     :secret => helpers.current_user.admin? ? "secrets!" : "no secrets" 
     # ... 
    } 
    end 
end 
+0

謝謝numbers1311407,我看着那寶石。你能讀我的編輯1嗎?也許你可以回答這個問題。 –