将js变量传递给服务器代码

时间:2012-11-21 06:28:54

标签: ruby-on-rails ajax

我有一个带有2个输入和按钮的表单。用户将Feed url放在第一个输入中,然后按下按钮:

<%= link_to "get name", { :controller => 'Feeds', :action => "get_title" }, 
:remote => true, :class=>'btn btn-mini' %>       

这是控制器方法

def get_title
   respond_to do | format |  
       format.js {render :layout => false}  
   end
end

这是一个get_title.js.erb:

var url = $( "#feed_url" ).val();
console.log(url);
$( "#feed_name" ).val("<%= @proxy.title(url) %>");

我得到第一个输入的值,并希望将它作为参数传递给Ruby类。但在这种情况下,我得到错误:

ActionView::Template::Error (undefined local variable or method `url' for #<#<Class:0x41ec170>:0x41ef968>):
    1: var url = $( "#feed_url" ).val();
    2: console.log(url);
    3: $( "#feed_name" ).val("<%= @proxy.title(url) %>");

认为'url'是一个Ruby变量,但不是JS变量。

如何将JS变量传递给Ruby代码?

提前致谢。

1 个答案:

答案 0 :(得分:1)

请记住,任何ERB(ruby)代码都是在服务器端执行的,而Javascript当然是呈现给客户端的。因此,在评估url值之前,您的行<%= @proxy.title(url) %>将呈现为WAY。您的情况的解决方案更多的是将数据传递给Rails并呈现响应。有三个方面可以促进这一点(请记住,这只是一种方法,我确信还有很多其他方法,并且可能有更好的方法):

1-您的link_to不会发布用户输入的URL值,因为它不是POST表单。相反,更改周围的表单使用:remote = true,并使用典型的form.submit按钮而不是此链接。您的表单将提交具有URL值(并且它将是异步的)。

2-在你的控制器中,像你想要的那样渲染你的标题,按照以下方式做一些事情:

def get_title
    render :text=>@proxy.title(params[:url])
end

3-绑定到ajax:成功事件,这些内容如下:

$("form#myForm").bind("ajax:success", function(event, data, status, xhr){
    $( "#feed_name" ).val(data) // data, in this case, is the rendered `@proxy.title(url)` we did in step 2.
})

希望这是有道理的。如果没有,请告诉我。