Rails 4:在CoffeeScript函数中设置链接目标

时间:2015-10-26 15:06:36

标签: javascript jquery ruby-on-rails ruby-on-rails-4 coffeescript

我正在构建一个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标准?

2 个答案:

答案 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>