1

我在我的Rails應用程序中設置了一個Exception notifier。所以,今天我拿到了第二個通知,該index模板丟失:在導軌應用程序中產生奇怪的「Missing template」異常

An ActionView::MissingTemplate occurred in products#index: 

Missing template products/index, application/index with {:locale=>[:en, :de], :formats=>["text/html;text/plain"], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :slim, :arb, :jbuilder]}. Searched in: 
* "/home/releases/20160518143810/app/views" 


------------------------------- 
Request: 
------------------------------- 

* URL : http://example.com/shop 
* HTTP Method: GET 
* IP address : xx.xx.xx.xx 
* Parameters : {"controller"=>"products", "action"=>"index"} 
* Timestamp : 2016-06-07 08:19:13 +0200 
* Server : vintage-shop.ch 
* Rails root : /home/releases/20160518143810 
* Process: 15714 

我知道一個事實,即該產品的指數模板是那裏的服務器上,並在VCS檢入和應用程序已經運行了現在一個月。所以我真的想知道,爲什麼會發生這種情況:

$ ls /home/releases/20160518143810/app/views/products/index.html.slim 

# -> /home/releases/20160518143810/app/views/products/index.html.slim 

這種情況怎麼樣?

更新:我查了一下IP地址,它不是我期望我的客戶來自的地區。所以我想知道這是否是某種攻擊,但問題仍然是如何觸發異常,即使模板存在。

回答

1

這可能是一個攻擊嘗試或(更可能我猜)一些隨機噪聲。這個問題似乎在格式 Rails從請求標頭解析出來。通常情況下,您應該在異常消息中看到類似於::formats=>[:html, :text, :js, :css, :ics]

格式通常使用請求URI(通常在點'.'被視爲格式規範之後的所有內容)或使用Accept標題在rails中確定。在你的情況下,它是我猜的頭(你應該能夠看到異常通知中的頭)。 Accept標頭應該包含逗號分隔內容類型,而不是分號 -separated,所以我猜這是異常的實際來源。

如果您想了解更多有關Rails格式分辨率的細節,請查看insightful blog post

+0

是的,這正是我的想法。如果我能看到,當服務器請求發生時,實際的rails記錄日誌可以更加自信地告訴我們。因爲該日誌非常詳細,以回答視圖渲染問題。 –

+0

感謝您的詳細信息。 Accept頭部實際上是分號分隔的。有沒有辦法使軌道回落到HTML,而不是拋出異常? – Besi

+0

我不知道有關回退到HTML,但你應該至少能夠使用['rescue_from'](http://stackoverflow.com/a/14566690/1544012)顯示404 not_found頁面或類似的東西。無論如何,這是一個客戶端錯誤,所以我認爲在這種情況下顯示錯誤頁面是正確的。不過要注意的是,使用這種方法,您將永遠不會得到更多Missing模板異常,即使這實際上會成爲您代碼中的實際問題。 – BoraMa