我正在构建一个Rails 4应用程序,我是JavaScript和CoffeeScript的新手。
在posts.coffee
中,我有以下功能:
jQuery ->
console.log("test")
$(".new-post").on "click", ->
date = $(this).data("date")
location.href = "/posts/new?post[date]=#{date}"
此功能的目标是允许用户在名为.new-post
- calendar-view
的自定义日历视图中点击/calendars/:id/calendar_view
div,然后将其发送到/calendars/:id/posts/new
通过网址传递:date
属性。
- - - -
更新:我的路线是:
resources :calendars do
resources :posts, shallow: true do
resources :comments, shallow: true
end
end
- - - -
更新2 :这是calendar_view.html.erb
中的内容:
<%= content_tag :div, class: "new-post", data: {date: date} do %>
- - - -
如何在CoffeeScript函数中实现URL的/calendars/:id
标准?
答案 0 :(得分:2)
假设您有一个<div>
。现在,您可以利用data
属性来帮助您构建网址。
<%= conent_tag :div, class: "new-post", data: {calendar_id: calendar.id, date: date } do %>
# I assume you have the access to the object `calendar`, so use it.
# some code.
<% end %>
现在在咖啡脚本代码中写如下:
jQuery ->
console.log("test")
$(".new-post").on "click", ->
date = $(@).data("date")
calendar_id = $(@).data("calendar-id")
location.href = "/calendars/#{calendar_id}/posts/new?post[date]=#{date}"
答案 1 :(得分:0)
虽然接受的答案很有效,但我将在下面概述一些补充方法:
这是最简单的方法,可以在模板中生成脚本标记,该标记将在客户端上进行评估。
在您的控制器中:
class SomeController < ApplicationController
def some_action
@registry = {
calendar_id: @calendar.id
}
end
end
在视图中:
<script>
REGISTRY = <%= @registry.to_json.html_safe %>
</script>
您可以稍后从您的coffeescript代码访问全局注册表。您必须确保的是(直接或间接)引用您的coffeescript的脚本标记包含在上述脚本标记之后。
在接受的解决方案上执行此操作的优势在于它避免了不必要的DOM访问。 javascript社区中的一个新兴最佳实践是不从DOM读取数据,因为DOM访问速度较慢。理想情况下,DOM应仅被视为呈现解决方案,而不是数据存储。
虽然一方面用于通过脚本标记公开REGISTRY的html可以重构为共享部分,但是客户端可用的变量的实际决定仍然在控制器内,这是它所属的恕我直言。它有助于防止逻辑/决策泄漏到您的表示层。
此外,如果您依赖于DOM属性,则在DOM准备好之前,您无法使用该数据(例如,用于启动请求或预加载内容)。这通常不是主要限制。
但是,如果应用程序很大,上述方法会导致代码越来越重复。如果url处理可以与实际进行网络通信的代码分离,那就更好了。
这个非常简单的优秀图书馆是js-routes。它为rails中定义的路由创建javascript函数。所以在你的coffeescript代码中你可以写:
path = Routes.new_post_path({ calendar_id, date })
就像在你的部分中一样。
如果您担心通过javascript或越来越多的javascript膨胀来保护您的私有路由不被外部世界使用,因为越来越多的路由被添加到大型应用程序中,js-routes具有允许您仅公开的配置选项路线的一个子集。
这有一个非常强大的好处 - 您的routes.rb文件是关于您的路线的唯一真实来源 - 就像它本来应该的那样。明天,如果你必须改变你的路线,你不必在几个使用字符串插值网址的coffeescript文件中搜寻。</ p>