有没有办法在两个不同的视图之间抓取/获取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?
答案 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。