如何避免在views / show中嵌入javascript

时间:2013-03-31 21:30:36

标签: ruby-on-rails backbone.js

我有一个Rails应用程序,它使用javascript(Backbone)在每个用户个人资料页面/views/users/show.html.erb上显示用户特定数据。我这样做是通过传递<%= @ user.id%>然而,作为Backbone的获取函数的数据参数,我知道如何获得<%= @ user.id%>的唯一方法进入Backbone的fetch功能是通过在每个views / users / show.html.erb页面中嵌入javascript,因此允许Backbone为每个views / users / show.html.erb页面加载不同的用户特定信息。虽然这很有效,但这似乎是错误的方法,因为我已经读过,我不应该像这样嵌入javascript。此外,我将不得不做很多事情,因为我希望显示许多不同类型的数据,比你在下面看到的更多。因此show.html.erb页面将填充javascript以使应用程序按我希望的方式工作。

问题:如何在不使用javascript的情况下为每个用户的节目页面获取@ user.id到Backbone的fetch函数中。在评论中,有人建议我使用app / assets / javascripts / user.js,但我不知道如何获得<%= @ user.id%>进入该文件。 @ user.id随时可以在show.html.erb

中找到
<script type='text/javascript'> 
    $(document).ready(function() {

       app.collections.awardCollection.fetch({ data: $.param({ user_id: <%= @user.id %> }) }).complete(function(){ 
      app.views.awardCollection = new app.Views.awardCollection({ collection : app.collections.awardCollection});
       app.views.awardCollection.render() 
    });
           });
  </script>

2 个答案:

答案 0 :(得分:2)

我看到LuísRamalho和Gon的评论是个不错的选择,但我建议使用以下方法:

  1. 如果变量中的变量不会更改,请使用&lt;%=%&gt;打印它位于app / assets / javascripts中的.js.erb文件下(请注意,在重新启动应用程序之前,它会被缓存)
  2. 如果您需要服务器变量,最好的方法是使用Ajax
  3. 您可以在app / assets / javascripts上的.js文件中定义函数,并从视图中调用这些函数
  4. 如果你真的不想在视图中使用任何Javascript代码,你可以在app / assets / javascripts上的.js上创建函数(对应于视图,对于顺序),并使用事件和/或存储隐藏字段中的变量(甚至使用HTML5中的数据属性)

答案 1 :(得分:2)

为了理解视图的工作原理,您可以根据需要为视图添加任意数量的扩展,并且它们将由正确的库进行解析。

如果你创建一个像

这样的视图
my_view.haml.erb

首先使用ruby(erb)进行解析,然后使用haml进行解析,并以html页面结束。

您可以为j创建许多视图,通常您希望在执行ajax时将其归档,因此您可以结束具有js视图,如:

my_view.js.erb

将解析第一个ruby(所有&lt; %%&gt;标记),它将以纯文本结尾,然后服务器将提供.js文件。但这通常是ajax的常见任务。

如果你需要渲染一个你想要放置一些js的html页面,并且你需要一些ruby代码,我通常做的是将数据放在带有隐藏div的html内容中。

您可以放入任何视图(即使在您的布局上,如果您希望全局可用),例如:

<div id="user_id" style="display: none;"><%= @user.id %></div>

然后在js(或coffeescript或其他)上你可以检查那个div的内容:

<script type="text/javascript">
  var user_id = $("#user_id").html();
</div>

当您想要为js文件调试或创建测试时,这非常有用,因为它的普通js并不会引发语法错误。