我在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变量传递给红宝石部分,我怎么能完成这个?
答案 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
分配值
现在你什么时候想要将这个变量传递给什么部分?