0

我有一个带有 2 个输入和按钮的表单。用户将提要 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) %>");

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

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

提前致谢。

4

1 回答 1

1

请记住,任何 ERB (ruby) 代码都是在服务器端执行的,而 Javascript 当然是在客户端呈现的。结果,在<%= @proxy.title(url) %>评估该 url 值之前,您的行就被渲染了。针对您的情况的解决方案更像是将数据传递给 Rails,并呈现响应。促进这一点的三件事(请记住,这只是一种方法,我相信还有很多其他方法,可能还有更好的方法):

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

2-在您的控制器中,像您尝试做的那样呈现您的标题,按照以下方式做一些事情:

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

3-绑定到 ajax:success 事件,类似于以下内容:

$("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.
})

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

于 2012-11-21T07:10:17.443 回答