2016-12-03 31 views
3

我使用來自Working with Javascript in Rails引導remote: true成語:爲什麼在我的Rails控制器操作中需要`render layout:false`?

# new.html.slim 
= form_for @thing, remote: true do |f| 
    f.text_field :whatever 
    f.submit 'Submit' 

# thing_controller.rb 
layout 'foo' 

def create 
end 

# create.js.erb 
alert('foobar') 

這將會失敗,因爲create.js.erb是 '富' 內呈現某種原因佈局並返回爲html,而不是JavaScript,儘管事實上該請求被正確處理爲Javascr IPT:

Processing by ThingsController#create as JS 
    Parameters: {"utf8"=>"✓", "commit"=>"Submit"} 
    Rendered things/create.js.erb (0.6ms) 

(該問題是相同的I是否有在控制器的動作的顯式respond_to格式塊)

如上所述herehere,包括在控制器動作render layout: false解決該問題:

# thing_controller.rb 
layout 'foo' 

def create 
    render layout: false 
end 

但爲什麼我需要render layout: false這裏?爲什麼Rails在HTML佈局中呈現JavaScript?我特別困惑,因爲我已經在其他幾個地方使用過相同的習語,從來沒有遇到過這個問題。

回答

3

默認情況下,rails中的操作控制器響應HTML響應(除非另有說明)。

layout 'foo'強制使用app/views/layouts/foo.html.slim作爲視圖文件的模板。因此與thing_controller.rb上的操作相關的所有視圖都會在佈局'foo'內呈現,並且默認情況下會將佈局'foo'和視圖文件create.html.slim生成的最終HTML發送回客戶端。

如果要強制執行返回的js模板而不是HTML文件,你需要在你的行動明確定義它是這樣的:

# thing_controller.rb 
layout 'foo' 

def create 
    respond_to do |format| 
    # use :template if your view file is somewhere else than rails convention 
    format.js { 
     :template => "somewhere/create.js.erb", 
     :layout => false 
    } 
    end 
end 

其中render layout: false強制軌不找任何佈局文件來包裝你查看文件(例如,rails引擎只處理create.js.erb文件,而不在'foo'佈局中定義HTML頭文件),以便將其發送回客戶端。

+0

我仍然迷茫爲什麼這是必要的。爲什麼Rails會想呈現'create.js。erb'在HTML模板中?該文件(在Rails生態系統中)的全部要點是在客戶端上執行JS。 Hartl在[tutorial](https://github.com/railstutorial/sample_app_rails_4/blob/master/app/controllers/relationships_controller.rb)中沒有'layout:false';是這種情況,由於某些原因,它只能使用默認的'application.html.erb'佈局而不使用'layout:false'工作? – Sasgorilla

+0

此外,在[使用Javascript在Rails指南]中沒有提到這一點(http://guides.rubyonrails.org/working_with_javascript_in_rails.html);如果每次使用模板時都需要'layout:false'(這總是很常見),那麼我希望在那裏提及一下。 – Sasgorilla

1

對於大多數要渲染的選項,渲染的內容將顯示爲當前佈局的一部分。

您可以使用:佈局選項告訴Rails使用一個特定的文件作爲佈局當前操作:「約定優於配置」

render layout: false 

你聽說過Rails所提倡的默認渲染這是一個很好的例子。默認情況下,Rails的控制器自動呈現對應於行動

與名稱的意見

你可以用它來避免渲染的特定作用,這可能會影響您的代碼延遲假

layout false 
layout 'foo', :except => :create 
相關問題