如何在js视图中将JavaScriptvariables传递给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); 

我想通过我的'我'JavaScriptvariables通过本地ruby部分,我怎么能做到这一点?

据我所知,没有办法直接做,原因也相当简单,HTML是在服务器端执行和JavaScript是客户端语言,这意味着它在您的本地浏览器执行,这就是为什么如果你甚至尝试要在两者之间传递一个variables,你必须向服务器发出一个请求,但是这个问题通过调用一个AJAX请求来解决,这个AJAX请求和向服务器发送一个新请求的做法是一样的,刷新或重新加载页面给用户一个幻想,没有任何请求。

一个人在这里问一个类似的问题

你可以在这里了解更多关于AJAX:

是的,你可以通过使用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> 

简单的答案是你不能。 部分在服务器端展开,稍后在客户端设置JavaScriptvariables。 你可以让i (作为一个variables名)的部分参数,并在那里使用它。

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

并在部分

 alert(<%= variable %>); 

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

它给你一个简单的对象,你可以通过window.gon传递variables给你的脚本

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

以下是关于如何执行此操作的几个不同选项:

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

最好的其他答案是正确的,这不能通过将JavaScriptvariables传递给erb部分,因为它是在服务器上,而不是客户端呈现。

但是,因为任何人都在寻找这个解决scheme,所以我不会在这里看到这个解决scheme,所以我会发布这个与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片段,你可以使用它来replace你的渲染页面的一部分。 您可以使用jQuery来获取您的data-num属性值,对其进行一些math计算,replace视图中的部分,然后再次设置属性值。

你可能会问,为什么要把Rails的局部变成所有的麻烦,并把它replace到页面上,而不是只获取数据属性,对它进行math运算,然后设置? 答案是这是最好的,也许是唯一的方法,当处理一个动作的asynchronous响应的时候,使用UJS渲染一个Rails部分的时候,这是非常重要的。

如果在create.js.erb模板中处理来自服务器的asynchronous响应,那么您的variables(例如@daily)将不会反映请求完成后完成的工作(例如,如果已经在像Sidekiq这样的后台服务器上处理)。 在这种情况下,您没有将最新的动作响应variables传递到js.erb文件中的Rails部分,但是您也无法将JavaScript data响应传递到您的部分中,正如在此问题中指出的那样。

据我所知,这种方法是在收到对asynchronous响应(未显示)的响应之后获得完全最新部分的唯一方法。 这让你获得最新的部分,允许你把你的JavaScript,它足够灵活,足以在任何使用情况下工作。

让我们让我们相互理解。 你的erb模板( new_daily.js.erb )将在服务器端进行处理,ruby代码将被评估(在<% %> ),进行replace,然后生成的JavaScript将被发送到浏览器。 在客户端浏览器将评估这个JavaScript代码和variablesi将被分配一个值。
现在你什么时候想要通过这个variables和什么部分?

1)你可以在你的erb模板中用全局variables创build一个js标签,之后你将能够从任何js文件中访问这个variables

 <%= 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中使用你的Railsvariables

有一个很好的文章,阅读它和你的具体情况的罚款解决schemehttp://railscasts.com/episodes/324-passing-data-to-javascript ,更多评论在这里http://railscasts.com/episodes/324 -passing数据到JavaScript的?视图= asciicast