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

时间:2011-08-05 05:00:50

标签: 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在控制器中定义,警报(&lt;%= @v_url%&gt;)位于部分_show_picture.html.erb

警告显示i而不是888.正确的语法是什么:locals =&gt; {:@v_url =&gt;的 'i'}

由于 临床

6 个答案:

答案 0 :(得分:2)

你不能这样做,因为JavaScript是一种客户端语言,而Ruby是一种服务器端语言。 Ruby不仅在 JavaScript之前被解析,而且在一个完全独立的机器上解析,无法在两者之间进行交互。

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

答案 1 :(得分:2)

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

例如,您可以拥有Rails控制器:

@i = 888

在你的js模板中:

var i = #{@i};

从技术上讲,这是将一个变量从Rails实例变量传递给JS变量。相反。

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

我喜欢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'])
})

答案 4 :(得分:0)

可以将两者与erb混合在一起。例如,使用backbone.js:

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

然后在你的控制器中:

def create
   ...some logic
  render :json => something
end

答案 5 :(得分:0)

你可以尝试client_variable gem,它包含一些功能让你更容易做到