将局部变量传递到另一个视图的JS - Rails

时间:2015-09-21 02:48:36

标签: javascript jquery ruby-on-rails

有没有办法在两个不同的视图之间抓取/获取js内的变量?假设我有一个带有的索引视图:

<% foo.each do |foo| %>
  <%= link_to 'bar', bar_path %> 
<% end %>

然后在bar中我想用foo.id选择器向特定元素添加一些jQuery:

$('div#<%= foo.id %>').fadeOut(); // I know the interpolation wouldn't work here

我知道我可以通过我的路径将foo.id传递给bar或通过locals哈希发送,但我怎样才能抓住&#34;它与jQuery?

3 个答案:

答案 0 :(得分:1)

您可以使用名为gon的gem轻松将变量传递给JS。

gem "gon"

你所要做的就是将这个gem添加到Gemfile中,然后你可以在任何控制器中调用gon:

class PaymentsController < ApplicationController

  def new
    ...
    gon.controller = "payments"
    gon.action    = "new"
    gon.message   = "Hello World!"
    ...
  end 
end

现在,在任何javascript(以下情况,coffeescript)中,你可以:

$ ->

  # Check if it is the target controller and action
  if gon? && gon.controller is "payments" &&  gon.action is "new"
    alert gon.message 

答案 1 :(得分:1)

  

有没有办法在js中获取/获取两个变量   不同的观点

不是没有黑客攻击。

JS是一种客户端技术,意味着它在浏览器中加载,而不是在服务器上加载。这对于试图绑定到动态命名对象的开发人员来说很多问题很有名,就像你正在尝试做的那样。

有几种方法可以解决这个问题。我会帮你找一遍:

<强>类

第一种方法是使用更广泛的标识符,例如element类型或class

您目前正在尝试选择foo.id,这意味着您必须以某种方式将该数据直接传递给JS。低效的。

更好的方法是使用这样的东西:

$("a.bar").on("click", function(e){
   $(this).fadeOut();
});

-

<强>网址

根据这个资源,没有内置的方法从JS中提取查询字符串:How to get the value from the GET parameters?

可以能够做到这样的事情:

$(document).ready(function(){
   foo = window.location.search.substring(1); //Considering you have http://url.com/your/foo/id
   $("#" + foo).fadeOut();
});

-

<强> ERB

有一个最后的选择,虽然这只有在你没有预编译你的JS(我不确定它实际上是否可行)的情况下才有效。这是在你的JS中直接使用ERB,而不是你在问题中所做的那样。

虽然这适用于动态引用(例如路径),但我认为它不能从控制器中提取数据。当然,除非您将脚本直接放在视图中< - >这违反了MVC的惯例。

#app/views/bar/show.html.erb
<script>
   // your code here
</script>

答案 2 :(得分:0)

我认为您需要创建一个js.erb文件,并在该传递中在控制器操作中定义一个变量。 代码ins js.erb看起来像这样:

<% fields_html = render "fields", :entity => @model %>
$("#fields-list").html("<%= escape_javascript fields_html %>") 

这里fields是我创建的部分内容。 :entity基本上是传递变量值。 @model是控制器操作中定义的变量。 fields-list是我要使用jquery加载的字段的ID。