Jquery 通过Sinatra控制器根据Ajax请求将haml视图加载到布局中

Jquery 通过Sinatra控制器根据Ajax请求将haml视图加载到布局中,jquery,ajax,json,sinatra,haml,Jquery,Ajax,Json,Sinatra,Haml,我正在我的页面中实现实时搜索功能。。我有以下简化的sinatra控制器 get '/search_item/:for' do //do some search stuff haml :search_item,:layout => (request.xhr? ? false : :layout), :locals => { :found_items => queried_items,

我正在我的页面中实现实时搜索功能。。我有以下简化的sinatra控制器

get '/search_item/:for' do
//do some search stuff
haml :search_item,:layout => (request.xhr? ? false : :layout),
                  :locals => {  :found_items => queried_items,
                                :current_user => current_user,
                                } 
end
然后我有一个layout.haml文件和输入字段

%input(type="text" id="search_query" name="search_query"  size="15" value="")
那两个div呢

#content
    = yield

#results(style="display=none")
现在开始我的问题,我需要一个jquery/javascript函数来发送xhr或json请求, 使用sinatra控制器中的输入生成搜索项目视图,然后在布局结果div中呈现/加载该视图,而不刷新整个页面。到现在为止,我有了一些类似的东西:

:javascript
 $(function() {
 $("#search_query").keyup(function(){
    var q = $("#search_query").val();
    if(q != ""){
----------- this is the problem part -------------
    $.get('/search_item/'+q, function(data) {
    $('#results').html(data);})
--------------------------------------------------
    $("#content").css("display","none");
    $("#results").css("display","inline");

    }
    else{
    $("#content").css("display","inline");
    $("#results").css("display","none");
    }}); });
有没有一种方法可以这样简单地将路由haml视图加载到div中

    var url = "/search_item/"+q;
    $('#results').load(url);
我试过了,但没用

我没有使用rails! 所以我有三个问题:

  • 我如何正确地将keyup上的请求发送到sinatra,以及如何在那里使用它
  • 然后如何在不刷新的情况下将search_item.haml呈现到layout.haml#results div中
  • 有没有更优雅的方法
  • 非常感谢您的帮助

    我如何正确地将keyup上的请求发送到sinatra,以及如何在那里使用它

    您需要在
    $.get()中将数据类型指定为html

    然后如何在不刷新的情况下将search_item.haml呈现到layout.haml#results div中

    首先,您需要将haml视图编译成html(浏览器不支持haml,但haml会编译成html/erb模板,您已经在这样做了!),然后您最好的方法可能是使用
    $(“某些选择器”).append(从“获取调用”接收的数据)
    ,或
    $(“某些选择器”).html(从“获取调用”接收的数据)

    有没有更优雅的方法

    我建议大家看看,这是一种javascript框架,用于管理单个页面UI

    一旦你搞定了,我建议你退房。你最终会用主干网重新发明轮子,所以一旦你了解主干网是如何工作的,这将使它真正具有生产力

    最后但并非最不重要。它只是更可读


    这三件事需要一些时间来理解,但它是值得的

    谢谢你的回答:)!如何在$.get()中指定html,以及如何在sinatra控制器中将haml视图呈现为html。您可以看到,作为对xhr请求的响应,我收到了一个HTTP/1.1500内部服务器错误。这可能是什么呢?您将其指定为第三个参数,请参见,基本上这只是告诉javascript如何处理传入数据。
    HTTP/1.1500内部服务器错误
    是服务器端的一个问题。当您向
    '/search\u item/'+q
    发出请求时,我注意到您没有使用
    :for
    ,也没有从javascript中的
    q
    变量传递它。当你向那个地址发出请求时,sinatra的错误日志会说什么?该死。。我应该看看辛纳屈的日志。它表明由于未初始化的变量,haml文件无法正确编译。非常感谢你的帮助。问题解决了。