2012-11-21 39 views
0

我有一個帶有2個輸入和按鈕的窗體。在第一輸入一個用戶把饋源URL,然後按下按鈕:將js變量傳遞給服務器代碼

<%= 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代碼?

在此先感謝。

+0

Ruby運行在服務器端。 JS在客戶端。因此,這是一種單向通信,不可能將視圖中的信息發送到Rails應用程序。 –

+0

那麼,在這種情況下最好的解決方案是什麼?使用JS製作另一個AJAX請求? – demas

回答

1

請記住,任何ERB(ruby)代碼都是在服務器端執行的,而Javascript當然是呈現在客戶端的。因此,您的行<%= @proxy.title(url) %>呈現WAY的方式之前,該值的評估。對你的情況的解決方案更多的是將數據傳遞給Rails,並呈現響應。有三件事情可以幫助你(考慮到這只是一種方法,而且我相信還有很多其他方法,並且可能有更好的方式):

1-您的link_to不會發布用戶輸入URL值,因爲它沒有發佈表單。相反,將周圍的表單更改爲使用:remote = true,並使用典型的form.submit按鈕而不是此鏈接。你的表單將被提交(它將是異步的)。

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. 
}) 

希望是有道理的。讓我知道如果它不。