Ruby - Sinatra:以表单输入作为参数异步调用方法

时间:2012-03-18 21:27:34

标签: ruby asynchronous sinatra user-input

我目前正在尝试构建一个小部件,它将根据用户名检索艺术家列表。

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'。

也许有一个简单的解决方案;但是这种感觉开始蔓延到我身上,我的方法开始时是错误的。我对任何其他实现这一目标的方式持开放态度。

1 个答案:

答案 0 :(得分:2)

据我所知,您正在动态生成JavaScript。因此,当您的Ruby代码生成它时,它会在您生成JavaScript代码时评估RFCore::get_artists表达式,而不是在用户与网页交互时。

如果是这种情况,我建议:

  1. 使用jQuery。它让你的生活更轻松。
  2. 当有一些用户交互(例如,按键)时,使用Ajax与您的服务器通信以获取艺术家列表。
  3. 这是一个小型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都是错误的,没有使用模板语言等等。