我正在尝试实现一个复杂的任务,并遇到一个问题,当我从format.js
调用时,我的JS代码不起作用。
我有这样的代码链接:
= link_to new_user_support_letter_path, {:id => 'contact-us', :remote => true }
在我的user_support_letters_controller.rb
:
def new
@letter = UserSupportLetter.new
respond_to do |format|
format.js {}
format.html
end
end
在new.js.erb
:
alert("rrr");
所以,当我点击链接时没有任何反应。
点击链接的有意义的日志:
I, [2016-10-19T21:47:41.130608 #1] INFO -- : Started GET "/user_support_letters/new" for 172.18.0.6 at 2016-10-19 21:47:41 +0000
I, [2016-10-19T21:47:41.150411 #1] INFO -- : Processing by UserSupportLettersController#new as JS
I, [2016-10-19T21:47:41.269853 #1] INFO -- : Rendered user_support_letters/new.js.erb within layouts/application (0.1ms)
I, [2016-10-19T21:47:41.344629 #1] INFO -- : Rendered application/_support_email.slim (0.1ms)
...
有谁可以告诉我做错了什么?感谢名单!
答案 0 :(得分:2)
要使其工作,您需要将layout设置为false并声明您正在使用的content_type。
据我所知/已经阅读过,这是rails中的标准行为。这是一篇类似的帖子,通过指向bug日志的链接进行讨论。 https://stackoverflow.com/a/1170121/3366016
将您的控制器操作更改为:
def new
@letter = UserSupportLetter.new
respond_to do |format|
format.js { render layout: false, content_type: 'text/javascript' }
format.html
end
end
默认情况下,它会尝试加载给定内容类型的当前布局。对于JS来说,通常很聪明,知道不加载布局。通过设置false,您将禁用布局,并告诉它在没有布局的情况下进行渲染。
看起来如果你使用某种形式的模板,它会稍微混淆请求。这个answer似乎在评论中确定了苗条模板的具体工作。这个answer描述了另一种解决方案,基本上使用默认布局设置。有了这个,Rails似乎知道如何处理JS请求。