2013-03-31 28 views
1

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

问题:如何将@ user.id变成每个用户的显示页面的Backbone的fetch函数,而不用像我所做的那样嵌入javascript。在评论中,有人建议我使用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> 
+0

您应该在'app/assets/javascripts/user.js'上添加javascript –

+0

但是如何将<%= user.id%>加入该文件?我按照你在OP中看到的方式做到了,因为我在views/show.html.erb中提供了@ user.id –

+2

看看[gon](https://github.com/gazay/gon)是否有用。 “如果你需要发送一些数据到你的js文件中,并且你不想通过视图和解析来完成这个任务 - 使用这个力量!” –

回答

2

为了理解视图是如何工作的,可以根据需要为视图添加尽可能多的扩展名,并且它们将由正确的库进行分析。

如果你创建了

my_view.haml.erb 

它将与红宝石(ERB)首先被解析的视图,然后用HAML,并会在HTML页面结束。

您可以创建JS很多意见,通常要存档,当你做AJAX,这样你就可以结束具有象一个js观点:

my_view.js.erb 

第一台红宝石会被解析(所有<% %>标签),它将以纯文本形式结束,然后服务器将为.js文件提供服务。但这通常是ajax的常见任务。

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

你可以把任何观点(甚至在你的布局,如果你希望它是全局可用),是这样的:

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

,然后在一个JS(或者CoffeeScript的或其他),你可以只检查该分区的内容:

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

时要调试或创建您的JS文件的测试,因为它的纯JS并不会抛出语法错误这是非常有用的。

2

我看到路易斯·拉马略的评论和刚是一个不错的选择,但我建议使用以下方法:

  1. 如果从变量不会改变,在位于app/assets/javascripts的.js.erb文件下打印它(注意,它将被缓存,直到您重新启动您的应用程序)
  2. 如果您需要服务器变量最好的方法是使用Ajax
  3. 你可以定义fu如果你真的不想在视图中使用任何Javascript代码,你可以在app/assets/javascripts上的.js文件中创建这些函数。如果你真的不想在视图中使用任何Javascript代码,你可以在app/assets/javascripts的.js文件中创建函数(对应于视图,对于订单)以及使用事件和/或将变量存储在隐藏字段中(甚至使用来自HTML5的数据属性)