2012-07-18 40 views
0

我有一個非常簡單的rails應用程序,它的一些功能是基於ajax的。 當我從開發環境使用它時,一切都按預期運行。 然而,在生產環境中發生了一些奇怪的事情:當進行ajax調用時,基於HTML(HAML的)佈局被呈現而不是js(基於Coffee)。爲什麼我的rails應用程序沒有正確響應生產環境中的.js格式?

當比較生產和開發的日誌時,很明顯,我在處理回覆的方式上做錯了一些事情,但是我現在一直在摸索我的頭幾個小時。

比方說,我的要求是:/software_tags/1/edit.js 在我的開發日誌,我可以看到(和輸出是正確的,我得到預期的JavaScript頁面):

Started GET "/software_tags/1/edit.js" for 127.0.0.1 at 2012-07-17 16:59:34 -0700 
Processing by SoftwareTagsController#edit as JS 
    Parameters: {"id"=>"1"} 
    Rendered shared/_error_messages.haml (0.1ms) 
    Rendered software_tags/_form.haml (4.5ms) 
    Rendered software_tags/edit.js.coffee (5.7ms) <---- THIS IS GOOD! 
Completed 200 OK in 10ms (Views: 8.1ms | ActiveRecord: 0.4ms) 

在但是我的開發日誌,我看到(和輸出是錯誤的,我得到的HTML頁面):

Started GET "/software_tags/1/edit.js" for x.x.x.x at 2012-07-18 01:59:54 +0200 
Processing by SoftwareTagsController#edit as JS <--- Wouldn't that force the edit.js.coffee to be rendered instead of the edit.haml? 
    Parameters: {"id"=>"1"} 
    Rendered shared/_error_messages.haml (0.1ms) 
    Rendered software_tags/_form.haml (2.8ms) 
    Rendered software_tags/edit.haml (3.2ms)  <---- THIS IS WRONG! 
Completed 200 OK in 5ms (Views: 3.5ms | ActiveRecord: 0.5ms) 

在我的控制器,編輯操作是這樣的:

def edit 
    respond_to do |format| 
     format.js 
     format.html 
     format.json { render json: @software_tag } 
    end 
    end 

當我嘗試訪問json數據,但是,所有環境中的一切都很好,所以js輸出的錯誤輸出可能是什麼問題?

編輯:也許我失去了一些相當簡單的東西。我仍然無法從生產環境中實現發展中的工作。我使用Ruby 1.9.3和Rails 3.2.6,以及jQuery/jQuery-ujs。基本上,我會改進我的問題:當將link_to remote:true時,我如何強制服務器用javascript文件來回答我(並且在respond_to.js塊上的分支而不是在html上)?

+0

的事實上,通過AJAX發出請求並不會改變請求所期望的格式。 XHR請求仍然可以用於HTML,XML,JSON,GIF或PDF資源。 – Gareth 2012-07-18 00:10:36

+0

我一直在搞各種各樣的事情,我真的不明白爲什麼行爲是從開發到生產(只有不同​​之處在於我使用前者的乘客)。我已經嘗試使用ajaxSetup函數更改jQuery中XHR的接受設置,但仍然是同樣的問題。任何幫助都感激不盡。 – Doodloo 2012-07-18 01:28:21

回答

5

如果是gem inside:assets group,則此gem僅用於資產目錄(在app,vendor,lib中),而不是在視圖中。

有三種方法來正常工作:

  1. 移動咖啡軌外資產
  2. 在apllication.rb取消註釋此:# Bundler.require(:default, :assets, Rails.env)
  3. 使用寶石咖啡意見https://github.com/yury/coffee-views
+0

謝謝rado。如果你能告訴我爲什麼這種行爲不同於開發到生產,我會很樂意接受你的答案。 – Doodloo 2012-07-18 15:51:21

+0

因爲在application.rb中你有這樣的:Bundler.require(* Rails.groups(:assets =>%w(開發測試)))這個負載組:開發中的資產,只在預編譯過程中被調用。 – rado 2012-07-21 13:55:29

+0

請注意,在生產中使用coffeescript模板會非常糟糕,因爲模板將在每次請求時通過coffeescript進行編譯。考慮改用js.erb。 – 2013-04-12 15:46:10

-1

你試過:

respond_to :js, :only => :edit 

在控制器的頂部?

或者在format.js塊中指定模板呈現方式與使用json塊的方式相同。

1

我終於找到了我的問題的答案。這聽起來像是一個錯誤,或者我錯過了一些東西。

我已經把我的控制器上的調試信息是這樣的:

def edit 
    respond_to do |format| 
    format.js { Rails.logger.info "in JS handler" } 
    format.html { Rails.logger.info "in HTML handler" } 
    format.json { render json: @software_tag } 
    end 
end 

事實上,正確的行動被稱爲,但作爲當文件edit.haml被渲染,而不是edit.js.coffe,甚至在format.js塊中。

我已經找到了解決辦法是寶石 '咖啡軌' 外移動:資產組從我的Gemfile,像這樣: 之前:

group :assets do 
    gem 'uglifier' 
    gem 'sass-rails' 
    gem 'coffee-rails' 
end 

後:

gem 'coffee-rails' 
group :assets do 
    gem 'uglifier' 
    gem 'sass-rails' 
end 

現在,生產環境中的一切都按預期工作。

感謝您的幫助!

+0

在Rails 3.2中有相同的問題,這工作! – 2016-09-06 12:29:31

相關問題