如何将JavaScript变量传递给Rails实例变量?

如何将JavaScript变量传递给Rails实例变量?,javascript,ruby-on-rails-3,Javascript,Ruby On Rails 3,下面是.js.erb中的javascript $(document).ready(function () { var i = 888 $( "#previewpicture" ).html( "<%= escape_javascript( render( :partial => "show_picture", :locals => { :@v_url => 'i' } ) ) %>" ); }); @v_url在控制器

下面是.js.erb中的javascript

$(document).ready(function () {
         var i = 888
      $( "#previewpicture" ).html( "<%= escape_javascript( render( :partial => "show_picture", :locals => { :@v_url => 'i'  }   ) ) %>" );
     });
@v_url在控制器中定义,警报在部分_show_picture.html.erb中

警报显示为i而不是888。什么是正确的语法:locals=>{:@v_url=>'i'}

谢谢
Clin

您不能这样做,因为JavaScript是客户端语言,Ruby是服务器端语言。Ruby不仅在JavaScript之前被解析,而且在完全独立的机器上被解析,两者之间没有交互的方式


为您的问题制定一个替代解决方案。

您不能这样做,因为JavaScript是客户端语言,Ruby是服务器端语言。Ruby不仅在JavaScript之前被解析,而且在完全独立的机器上被解析,两者之间没有交互的方式


找出解决问题的替代方案。

这不起作用,因为JS是在页面显示在浏览器上之后执行的。但是,如果页面上需要依赖于Javascript条件或变量的内容,则应向服务器发出AJAX调用,获取标记并将其放置在页面中。

这将不起作用,因为JS是在页面显示在浏览器上之后执行的。但是,如果页面上需要依赖于Javascript条件或变量的内容,则应该对服务器进行AJAX调用,获取标记并将其放置在页面中。

正如Ryan Bigg所指出的,您不能这样做。但是,如果您需要在Rails所在的服务器端和JS所在的客户端中都存在某个值,那么最好将该值存储在服务器端

例如,在Rails控制器中可以有:

@i = 888
def create
   ...some logic
  render :json => something
end
在js模板中:

var i = #{@i};
从技术上讲,这是将一个变量从Rails实例变量传递到JS变量。相反


如果要将JS变量从客户端传递到服务器,可以调用ajax请求将变量作为参数传递给服务器,然后让Rails响应要在页面上更新的模板。

正如Ryan Bigg所指出的,您不能这样做。但是,如果您需要在Rails所在的服务器端和JS所在的客户端中都存在某个值,那么最好将该值存储在服务器端

例如,在Rails控制器中可以有:

@i = 888
def create
   ...some logic
  render :json => something
end
在js模板中:

var i = #{@i};
从技术上讲,这是将一个变量从Rails实例变量传递到JS变量。相反

如果要将JS变量从客户端传递到服务器,可以调用ajax请求将该变量作为参数传递给服务器,然后让Rails使用要在页面上更新的模板进行响应。

我喜欢jQuery原生数据交叉浏览键值存储来保存服务器端变量,这取决于某个对象。JS变量很好,但如果需要使用面向对象的变量,请尝试这种方法:

# erb file
<% javascript_tag do %>
  var i    = <%= server_variable %> // 888
  var obj  = $('#previewpicture');
  var data = $.data(obj, "vars", {v_url: i})
<% end %>

<%= render :partial => "show_picture" %> #v_url will be assign by JS on page load


# js file
$(document).ready(function () {
  $('#previewpicture').attr('v_url', data['v_url'])
})
我喜欢jQuery原生数据交叉浏览键值存储来保存服务器端变量,这取决于某个对象。JS变量很好,但如果需要使用面向对象的变量,请尝试这种方法:

# erb file
<% javascript_tag do %>
  var i    = <%= server_variable %> // 888
  var obj  = $('#previewpicture');
  var data = $.data(obj, "vars", {v_url: i})
<% end %>

<%= render :partial => "show_picture" %> #v_url will be assign by JS on page load


# js file
$(document).ready(function () {
  $('#previewpicture').attr('v_url', data['v_url'])
})

有可能将两者与雇员再培训局结合起来。例如,对于backbone.js:

#something.html.erb 
<script>
    function makeSomething() {
        Something.create({
            prop1: val1,
            prop2: val2,
            prop3: val3
          });
    }
</script>

有可能将两者与雇员再培训局结合起来。例如,对于backbone.js:

#something.html.erb 
<script>
    function makeSomething() {
        Something.create({
            prop1: val1,
            prop2: val2,
            prop3: val3
          });
    }
</script>

你可以尝试,它为你包装了一些函数,让你做得更容易

你可以尝试,它为你包装了一些函数,让你做得更容易

我不确定,因为我使用的是Python而不是Ruby,但我认为你做得不对。我的意思是,并不是说你的语法或诸如此类的错误,而是你用了错误的方式。我认为您不应该将客户端变量“传递”给服务器端函数。你可以把它们寄出去。或者去拿。我不确定,因为我使用的是Python而不是Ruby,但我认为你做得不对。我的意思是,并不是说你的语法或诸如此类的错误,而是你用了错误的方式。我认为您不应该将客户端变量“传递”给服务器端函数。你可以把它们寄出去。或者去拿。但不能“传递”它们。全局变量可以。另一种方法是使用jQuery本机键值存储$。另一种方法是使用jQuery本机键值存储$.data