簡體   English   中英

Ruby - Sinatra:以表單輸入作為參數異步調用方法

[英]Ruby - Sinatra: Asynchronously calling method with form input as parameter

我目前正在嘗試構建一個小部件,它將根據用戶名檢索藝術家列表。

Ruby方法需要一個username參數,然后進行API調用以檢索實際的字符串數組。

該網頁具有輸入字段,用戶可以在其中填寫他/她的用戶名。 我的目標是立即調用ruby方法並顯示藝術家列表。 我的問題是能夠使用實際的表單輸入作為參數。 我認為這對於params [:user]來說相對容易,就像在Sinatra post方法中完成的那樣。 事實證明,事實並非如此。

我嘗試了兩種JS方法並在以下方法之后直接調用該方法:onkeyup。

使用Javascript:

userChanged = function() {                  
    var user = document.getElementById("username");
    if (user.value.length != 0){                
    artists = #{RFCore::get_artists(:name => params[:user]).to_json};
    art_list.innerHTML = artists
    };
};

:的onkeyup

:onkeyup => "art_list.innerHTML = #{RFCore::get_artists(:name => params[:user])[0]}"

我用params [:user]替換了我能想到的所有變體,例如“#{user}”和user。

返回的錯誤是未定義的方法[]' for params[:user] and undefined local variable or method用戶'用於“#{user}”和用戶。

也許有一個簡單的解決方案; 但是這種感覺開始蔓延到我身上,我的方法開始時是錯誤的。 我對任何其他實現這一目標的方式持開放態度。

據我所知,您正在動態生成JavaScript。 因此,當您的Ruby代碼生成它時,它會在您生成JavaScript代碼時評估RFCore::get_artists表達式,而不是在用戶與Web頁面交互時。

如果是這種情況,我建議:

  1. 使用jQuery 它讓您的生活更輕松。
  2. 當有一些用戶交互(例如,按鍵)時,使用Ajax與您的服務器通信以獲取藝術家列表。

這是一個小型Sinatra應用程序,演示了這種方法:

require 'sinatra'

get '/' do
  <<html
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
function userChanged()
{
  $.get('/get-artists',
        {username: $('#username').val()},
        function(data){
          $('#artists').html(data);
        });
}
</script>
User: <input id="username" type="text">
<button onclick="userChanged();">Look up</button>
<div id="artists"/>
html
end

get '/get-artists' do
  "Generate here list for user #{params[:username]}"
end

請注意,上面的代碼只是一個例子。 生成的HTML都是錯誤的,沒有使用模板語言等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM