Rails 4:coffeescript 仅在有发布请求或我重新加载页面时才有效
Posted
技术标签:
【中文标题】Rails 4:coffeescript 仅在有发布请求或我重新加载页面时才有效【英文标题】:Rails 4: coffeescript only works when there is a post request or when i reload the page 【发布时间】:2013-09-23 13:58:17 【问题描述】:我主要是后端开发人员,对 javascript 相关的东西(以及该地方存在的所有框架)不太熟练。我知道这很糟糕,但事实就是如此。
我正在为我遇到的问题而疯狂,我可能错过了一些非常基本的东西。我做了一些研究(谷歌+堆栈溢出圣经),没有发现任何与我遇到的问题相似的案例。我想我只是不知道我在做什么。让我解释一下。
发生了什么
我将 Rails 4 用于一个小型(无用)项目,并尝试在咖啡脚本文件中编写一些 javascript“代码”。
显然,我编写的咖啡脚本“代码”仅在我重新加载页面时或在 POST
请求之后(例如,当您提交表单时)有效。例如,在 GET
请求中,在从一个页面导航到另一个页面期间,什么都没有发生。
我尝试了一个非常简单的基本 101 测试:在页面上显示一条警报消息(你好!)(它首先包含一个日期选择器)。
假设我有一个Article
模型和一个关联的ArticlesController
来编辑/创建/删除数据。我有以下文件:
app/assets/javascripts/application.js
app/assets/javascripts/articles.js.coffeee
app/controllers/articles_controller.rb
app/models/article.rb
app/views/articles/new.html.erb
app/views/articles/index.html.erb
etc.
我只是在app/assets/javascripts/articles.js.coffee
中添加一行:
alert "Hello!"
如果我提交表单或重新加载页面,我会看到警报“Hello!”。如果我只是点击一个链接,例如编辑一篇文章,什么都不会发生。
日志
当我查看这两种情况下的 rails 日志时,我有两种不同的情况:
在“它不工作”的情况下,当我执行一个简单的get
请求(通过单击编辑链接)时,我在日志中有这个:
Started GET "/articles/1/edit" for 127.0.0.1 at 2013-09-17 14:35:28 -0400
Processing by ArticlesController#edit as HTML
Parameters: "id"=>"1"
Author Load (0.3ms) SELECT "authors".* FROM "authors" WHERE "authors"."remember_token" = 'ab6fa1c5257585de99459c60f24121c' LIMIT 1
Article Load (0.2ms) SELECT "articles".* FROM "articles" WHERE "articles"."author_id" = ? AND "articles"."id" = 1 ORDER BY published_at DESC LIMIT 1 [["author_id", 1]]
Rendered shared/_error_messages.html.erb (0.1ms)
Rendered articles/edit.html.erb within layouts/application (6.6ms)
Rendered layouts/_shim.html.erb (0.1ms)
Rendered layouts/_header.html.erb (0.6ms)
Rendered layouts/_footer.html.erb (0.1ms)
Completed 200 OK in 44ms (Views: 40.4ms | ActiveRecord: 0.4ms)
在“它确实有效”的情况下,例如,当我重新加载相同的编辑页面时,它会重新加载所有内容..
Started GET "/articles/1/edit" for 127.0.0.1 at 2013-09-17 14:37:28 -0400
Processing by ArticlesController#edit as HTML
Parameters: "id"=>"1"
Author Load (0.3ms) SELECT "authors".* FROM "authors" WHERE "authors"."remember_token" = 'ab6fa1c5257585de99459c60f24121c' LIMIT 1
Article Load (0.1ms) SELECT "articles".* FROM "articles" WHERE "articles"."author_id" = ? AND "articles"."id" = 1 ORDER BY published_at DESC LIMIT 1 [["author_id", 1]]
Rendered shared/_error_messages.html.erb (0.1ms)
Rendered articles/edit.html.erb within layouts/application (5.0ms)
Rendered layouts/_shim.html.erb (0.1ms)
Rendered layouts/_header.html.erb (0.4ms)
Rendered layouts/_footer.html.erb (0.1ms)
Completed 200 OK in 26ms (Views: 23.4ms | ActiveRecord: 0.4ms)
Started GET "/assets/application.css?body=1" for 127.0.0.1 at 2013-09-17 14:37:28 -0400
Started GET "/assets/jquery_ujs.js?body=1" for 127.0.0.1 at 2013-09-17 14:37:28 -0400
Started GET "/assets/application.css?body=1" for 127.0.0.1 at 2013-09-17 14:37:28 -0400
Started GET "/assets/articles.css?body=1" for 127.0.0.1 at 2013-09-17 14:37:28 -0400
Started GET "/assets/jquery.js?body=1" for 127.0.0.1 at 2013-09-17 14:37:28 -0400
Started GET "/assets/articles.js?body=1" for 127.0.0.1 at 2013-09-17 14:37:28 -0400
Started GET "/assets/application.js?body=1" for 127.0.0.1 at 2013-09-17 14:37:28 -0400
Started GET "/assets/turbolinks.js?body=1" for 127.0.0.1 at 2013-09-17 14:37:28 -0400
(i removed some of the lines to make it clearer)
我尝试了什么
我尝试用
生成js文件rake assets:precompile
但它是一样的。
我尝试安装一些 gem,比如 therubyracer、barista,都是一样的。
我错过了一些非常基本的东西吗?我应该读一本关于 javascript 基础的书吗?我应该因为不理解一些很容易的事情而被驱逐到阿拉斯加吗?我应该退休还是换工作?
感谢您的帮助。我陷入了抑郁。
【问题讨论】:
JQuery in Rails is failing after linking from another page, works on page load 的可能重复项 你没疯,我也遇到了同样的问题——主要是在 GET 请求之后(我在 config/routes.rb 中将其路由为删除) Rails javascript only works after reload的可能重复 【参考方案1】:这是因为 turbolinks gem。当您单击一个链接时,浏览器并没有真正重新加载页面,它只是执行 AJAX 请求并更改标题和正文,其他所有内容保持不变。
如果你想绕过它,你可以从你的 application.js
文件中删除 turbolinks
或安装 jquery-turbolinks gem
并在你需要 jquery 或 jquery ui 之后放置 //= require jquery.turbolinks
。
我还建议在您的咖啡盒中使用 $ ->
或 $(document).ready ->
(在大多数情况下几乎相同)。
【讨论】:
谢谢你!我删除了 gem 和所有对它的调用,它起作用了。谢谢谢谢。 @d34n5 实际上我更喜欢打开 turbolinks,因为它们确实加快了应用程序的加载时间。浏览器不需要每次都去获取所有的css和js,然后重新渲染。 我终于重新安装了它,安装了 jquery-turbolinks gem 并在 application.js 中添加了这一行。一切正常。 谢谢这对我有用。但是你需要 false false %>, 和 css 一样.... :)【参考方案2】:这是由于turbolinks
造成的问题:您的 javascript 文件仅被评估一次(在页面加载时)。
要在页面更改时强制重新评估您的代码,请在 page:load
事件上添加一个事件侦听器:
ready = ->
alert 'hello'
$(document).ready(ready)
$(document).on('page:load', ready)
【讨论】:
"ready"
应该在我认为的最后两行的引号中。
@GeorgeMillo 不,在这种情况下,ready
是回调,而不是事件。以上是关于Rails 4:coffeescript 仅在有发布请求或我重新加载页面时才有效的主要内容,如果未能解决你的问题,请参考以下文章
Coffeescript 和 jQuery 无法在特定视图上使用 Ruby on Rails
是否/为啥 Rails 6 仍在使用/推荐 CoffeeScript?
导轨 3.1。如何防止 Rails 使用 CoffeeScript?