从js文件访问rails控制器变量

时间:2012-12-11 03:52:14

标签: jquery ruby-on-rails-3 will-paginate

我有一个index.htm.erb文件,里面有一个渲染模板文件。

<div id="product"> <%= render :template => "shop/products" %> </div>

在我的控制器中

  def index
    @products = Product.paginate :page => params[:page], :per_page => 6 
  end

我的index文件底部有一个js文件,里面有一个脚本来获取will_paginate url。

$(window).scroll(function(){
        if( $(this).scrollTop() > ( ( $(document).height() - $(this).height() ) - 50 ) ){
            var link = $('.pagination .next_page').attr('href');
            $.getScript( link );
        }


        });

此getScript调用与index.html.erb同名的js文件。所以它的index.js.erb。 在js.erb文件中我有一个

console.log("products = ", @products);

尝试检索实例变量时出错。 500内部服务器错误 我无法访问@products变量。 要访问此变量,我需要做什么。

更新:

我正在使用http://railscasts.com/episodes/114-endless-page-revised?autoplay=true中的相同教程 唯一的区别是我在index.html.erb中使用了一个模板 所以我仍然不明白在教程中他们如何访问实例变量,但我没有

2 个答案:

答案 0 :(得分:1)

无视答案

我不是一个很大的RoR家伙,所以我可能会对这种情况有所了解,但我仍然想尝试帮助你。这是我的猜测:

这不是真正的RoR相关,而是一般来说是前端问题的后端。 JavaScript完全在浏览器中运行,而Rails只在服务器上运行。因此,JS不知道您在Ruby environmt中定义的所有变量。如果你想在JS中访问变量,你必须以某种方式将它写入页面。

简单地说,你需要做一些事情:

<script>
    var productName = "<%= @product.name %>";
</script>

因此Rails将解析html并用实际名称替换<%= @product.name %>部分。所以浏览器检索一个看起来像这样的HTML

<script>
    var productName = "Ice Cream";
</script>

这是一种非常简单的方法,可以将变量从后端传递到前端。

答案 1 :(得分:0)

尝试明确地将@products变量传递给您的模板:

<%= render :template => "shop/products", :locals => {:my_products => @products} %>

然后,您可以在my_products模板中使用变量shop/products,无论您当前使用的是@products