1

我有一个 Rails 应用程序,它使用 javascript (Backbone) 在每个用户个人资料页面 /views/users/show.html.erb 上显示用户特定数据。我通过将 <%= @user.id %> 作为数据参数传递给 Backbone 的 fetch 函数来做到这一点,但是,我知道如何将 <%= @user.id %> 放入 Backbone 的 fetch 函数的唯一方法是嵌入每个views/users/show.html.erb 页面中的javascript,因此允许Backbone 为每个views/users/show.html.erb 页面加载不同的用户特定信息。虽然这可行,但它似乎是错误的做法,因为我已经读过我不应该像这样嵌入 javascript。此外,我将不得不做很多事情,因为我希望显示很多不同类型的数据,比你在下面看到的要多。所以 show.html.erb 页面将充满 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>
4

2 回答 2

2

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

  1. 如果变量 from 不会更改,请在 app/assets/javascripts 中的 .js.erb 文件下使用 <%= %> 打印它(请注意,它将被缓存,直到您重新启动应用程序)
  2. 如果您需要服务器变量,最好的方法是使用 Ajax
  3. 您可以在 app/assets/javascripts 上的 .js 文件上定义函数并从视图中调用这些函数
  4. 如果您真的不希望视图中有任何 Javascript 代码,您可以在 app/assets/javascripts 上的 .js 上创建函数(对应于视图,用于排序),并使用事件和/或将变量存储在 hidden字段(甚至使用 HTML5 中的 data 属性)
于 2013-03-31T21:44:50.187 回答
2

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

如果你创建一个像

my_view.haml.erb

它将首先用 ruby​​ (erb) 解析,然后用 haml 解析,并以 html 页面结束。

您可以为 js 创建许多视图,通常您希望在执行 ajax 时将其存档,这样您就可以结束 js 视图,例如:

my_view.js.erb

首先将解析 ruby​​(所有 <% %> 标记),以纯文本结尾,然后服务器将提供 .js 文件。但这通常是 ajax 的常见任务。

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

您可以放入任何视图(如果您希望它在全球范围内可用,甚至在您的布局中),例如:

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

然后在 js(或咖啡脚本或其他)上,您可以检查该 div 的内容:

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

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

于 2013-03-31T23:34:21.790 回答