2012-05-10 44 views
0

我有一個index.js就位,它可以從桌面啓動,但當我嘗試從Mobile Safari打開時出現以下錯誤。ActionView :: MissingTemplate:缺少模板(嘗試渲染不存在的:移動格式)

ActionView::MissingTemplate: Missing template ads/thumbs/index, application/index with {:locale=>[:es, :en], :formats=>[:mobile], :handlers=>[:erb, :builder, :haml]}. Searched in: * "/app/app/views" * "/app/vendor/bundle/ruby/1.9.1/gems/devise-1.5.2/app/views" * "/app/app/views" 

我不知道爲什麼它正在尋找:formats=>[:mobile]時,有沒有這樣的文件夾中的文件。

在嘗試使用手機設計登錄後發生同樣的事情。我試圖呈現不存在的create.mobile.haml文件。

P.S. Is there a way to make :mobile views to fallback default :html views when not found?這會製造詭計。

回答

0

您應該通常使用特定於內容類型的視圖進行響應。在這種情況下,簡單的方法是將index.js重命名爲index.mobile.js

Rails嘗試呈現特定於請求的內容類型的視圖 - 例如,請求html時的index.html.haml或請求json時的show.json.haml。在這種情況下,請求的內容類型是:mobile

從長遠來看,您應該開發視圖,當請求不同的內容類型時,視圖將被髮回。

+0

是的,我知道,但該應用只在該頁面上詢問':mobile'。在應用程序的其餘部分,我沒有任何':mobile'版本,並且正常渲染常規視圖。是否有任何解決方案,這不涉及再次複製該文件並重命名它? – Martin

+0

對不起 - 不要暗示你不明白。我不知道你能理解多少。這裏有很多人的知識較少。 –

+0

這是否違反Rails原則不要重複自己?如果我需要添加每個視圖的移動版本,我肯定會得到很多重複。我仍然在尋找更多的Rails方法。 – Martin

0

這是一個簡單的解決方案。

class ApplicationController 
    ... 
    def formats=(values) 
     values << :html if values == [:mobile] 
     super(values) 
    end 
    ... 
end 

事實證明,Rails(3.2.11)已經爲:js格式的請求添加了一個:html fallback。這裏的ActionView::LookupContext#formats=

# Override formats= to expand ["*/*"] values and automatically 
# add :html as fallback to :js. 
def formats=(values) 
    if values 
    values.concat(default_formats) if values.delete "*/*" 
    values << :html if values == [:js] 
    end 
    super(values) 
end 

所以,你可以覆蓋#formats=自己,這將是可以想象沒有更多的毛,比現有的Rails實現哈克。

相關問題