我使用了在 Rails 中使用 Javascript指南中的remote: true习语:
# new.html.slim
= form_for @thing, remote: true do |f|
f.text_field :whatever
f.submit 'Submit'
Run Code Online (Sandbox Code Playgroud)
# thing_controller.rb
layout 'foo'
def create
end
Run Code Online (Sandbox Code Playgroud)
# create.js.erb
alert('foobar')
Run Code Online (Sandbox Code Playgroud)
这失败了,因为由于create.js.erb某种原因在 'foo' 布局内呈现并返回为 html,而不是 javascript,尽管该请求被正确处理为 Javascript:
Processing by ThingsController#create as JS
Parameters: {"utf8"=>"?", "commit"=>"Submit"}
Rendered things/create.js.erb (0.6ms)
Run Code Online (Sandbox Code Playgroud)
(无论我respond_to在控制器操作中是否有显式格式块,问题都是一样的。)
如此处和此处所述,包括render layout: false在控制器操作中解决了问题:
# thing_controller.rb
layout 'foo'
def create
render layout: false
end
Run Code Online (Sandbox Code Playgroud)
但为什么我需要render layout: false这里?为什么 Rails 在 …
我正在使用以下代码在rails 3中设置AJAX操作.代码的AJAX部分似乎有效,但它没有请求正确的文件,我的respond_to为常规HTML提供服务.
路由信息:
resources :zones do
resources :records
end
Run Code Online (Sandbox Code Playgroud)
控制器:
def new
@zone = Zone.new
respond_to do |format|
format.html
format.js
end
end
Run Code Online (Sandbox Code Playgroud)
链接视图(haml):
= link_to 'Add a zone →', new_zone_path, :remote=>true
Run Code Online (Sandbox Code Playgroud)
从link_to生成的HTML(还注意到html实体的失败呈现......但这是另一个问题):
<a href="/zones/new" data-remote="true">Add a zone &#8594;</a>
Run Code Online (Sandbox Code Playgroud)
对于踢,视图/区域的目录列表.我不确定我这样做是否正确,所以我有new.js.rjs和new.rjs.它们都具有相同的内容,但从未被动作拾取.
| `~zones/
| |-_form.html.haml
| |-_record.html.haml
| |-edit.html.haml
| |-index.html.haml
| |-new.html.haml
| |-new.js.rjs
| |-new.rjs
| `-show.html.haml
Run Code Online (Sandbox Code Playgroud)
最后,从我点击链接时的服务器日志:
Started GET "/zones/new" for 127.0.0.1 at Wed Dec 29 00:04:03 -0700 2010
Processing by ZonesController#new as */*
User Load (0.4ms) SELECT "users".* …Run Code Online (Sandbox Code Playgroud)