我有一个带有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代码?
提前致谢。
答案 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.
})
希望这是有道理的。如果没有,请告诉我。