这是.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'}
由于 临床
答案 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,它包含一些功能让你更容易做到