我使用來自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
格式塊)
如上所述here和here,包括在控制器動作render layout: false
解決該問題:
# thing_controller.rb
layout 'foo'
def create
render layout: false
end
但爲什麼我需要render layout: false
這裏?爲什麼Rails在HTML佈局中呈現JavaScript?我特別困惑,因爲我已經在其他幾個地方使用過相同的習語,從來沒有遇到過這個問題。
我仍然迷茫爲什麼這是必要的。爲什麼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
此外,在[使用Javascript在Rails指南]中沒有提到這一點(http://guides.rubyonrails.org/working_with_javascript_in_rails.html);如果每次使用模板時都需要'layout:false'(這總是很常見),那麼我希望在那裏提及一下。 – Sasgorilla