如何在js视图中将javascript变量传递给erb代码?

时间:2011-02-10 16:23:54

标签: javascript ruby-on-rails view erb

我在Rails 3项目中有这个Javascript视图:

应用程序/视图/费用/ new_daily.js.erb

var i = parseInt($('#daily').attr('data-num')) + 1;
//$('#daily').append('agrego fila ' + i + ' <br />');

$('#daily').append('<%= escape_javascript(render(partial: 'new_expense', locals: { i: i })) %>');

$('#daily').attr('data-num', i);

我想通过本地人将我的'i'javascript变量传递给红宝石部分,我怎么能完成这个?

8 个答案:

答案 0 :(得分:22)

据我所知,没有办法直接做,原因也很简单,html在服务器端执行,javascript是客户端语言,这意味着它在本地浏览器中执行,这就是为什么如果您甚至尝试在两者之间传递变量,您必须向服务器发出请求, 但是,通过调用AJAX请求解决了这个问题,这个AJAX请求与向服务器发送新请求的方式相同,但是如果没有刷新或重新加载页面,它会让用户产生没有请求的错觉。< / p>

一个人问一个类似的问题Here

您可以详细了解AJAX Here on MDN

答案 1 :(得分:14)

是的,你可以使用jquery传递值;

<%=f.text_field :email ,:id=>"email_field" %>

<script type="text/javascript">
   var my_email= "my@email.com"
   $(document).ready(function(){
        $("#email_field").val(my_email);
   });
</script>

答案 2 :(得分:3)

简单的答案是你不能。部分在服务器端扩展,JavaScript变量稍后在客户端设置。您可以将i(作为变量名称)作为partial的参数并在那里使用它。

render :partial => 'xx', :locals => { :variable => 'i' }

部分

alert(<%= variable %>);

答案 3 :(得分:3)

查看gon gem。 https://github.com/gazay/gon

它为您提供了一个简单的对象,您可以通过window.gon

将变量传递给脚本。

此处也引用 http://railscasts.com/episodes/324-passing-data-to-javascript

答案 4 :(得分:2)

以下是有关如何操作的几个不同选项:

http://jing.io/t/pass-javascript-variables-to-rails-controller.html

答案 5 :(得分:2)

这里最好的其他答案是正确的,这不能通过将javascript变量传递到erb部分来完成,因为它是在服务器而不是客户端上呈现的。

但是,由于任何寻找此问题的人都可能对解决方案感兴趣,我在这里看不到,我将发布这个适用于Rails UJS和Turbolinks的示例。

首先,设置控制器以将部分返回为HTML:

format.html { render partial: "new_expense" }

接下来,在app/views/expenses/new_daily.js.erb中编写一个javascript AJAX函数:

var i = parseInt($('#daily').attr('data-num')) + 1;

$.ajax({
  url: '/daily',
  type: 'GET',
  dataType: 'html',
  contentType: "application/html",
  success: function(response) { 

      $('#daily').replaceWith(response)

      $('#daily').attr('data-num', i);
  }
});

这将使您的Rails成为一个html片段,您可以用它来替换渲染页面的那一部分。您可以使用jQuery获取data-num属性值,对其进行一些数学运算,替换视图中的partial,然后再次设置属性值。

你可能会问为什么要解决Rails部分问题并将其替换为页面的问题,而不仅仅是获取数据属性,对其进行数学运算,并设置它?答案是,在处理对动作的异步响应时,使用UJS部分渲染Rails时,这是最好的,也许是做某事的唯一方法。

如果您在create.js.erb模板中处理来自服务器的异步响应,那么您的变量(例如@daily)将不会反映请求完成后所做的工作(例如,如果在Sidekiq等后台服务器上进行了处理。在这种情况下,您没有将最新的操作响应变量传递到js.erb文件中的Rails部分,但您也无法通过javascript data响应正如这个问题所指出的那样。

据我所知,这种方法是在收到对异步响应(未显示)的响应后获得完全最新部分的唯一方法。这可以让你获得最新的部分内容,允许你将javascript加入其中,并且足够灵活,可以在任何用例中使用。

答案 6 :(得分:2)

1)你可以在你的erb模板中创建一个带有全局变量的js标签,之后你就可以从任何一个js文件中访问该变量了

<%= javascript_tag do %>
   window.productsURL = '<%= j products_url %>';
<% end %>

2)您可以将数据传递到erb模板中的data-attribute,并通过js在客户端以$('#products').data('products')

方式访问它
<%= content_tag "div", id: "products", data: {products: Product.limit(10)} do %>
   Loading products...
<% end %>

3)您可以使用gon在js中使用Rails变量

有一篇好文章,请阅读并为您的具体案例提供精细解决方案 http://railscasts.com/episodes/324-passing-data-to-javascript, 更多评论在这里http://railscasts.com/episodes/324-passing-data-to-javascript?view=asciicast

答案 7 :(得分:0)

让我们真诚地相互理解。您的erb模板(new_daily.js.erb)将在服务器端处理,ruby代码将被评估(在<% %>内),替换,然后生成的javascript将被发送到浏览器。在客户端,浏览器将评估此javascript代码,并为变量i分配值 现在你什么时候想要将这个变量传递给什么部分?