在不继续刷新的情况下更新rails中的页面

时间:2012-06-14 18:31:20

标签: ruby-on-rails-3 model-view-controller jquery

我想使用我编写的网页编写脚本中的信息更新rails中的erb.html页面,但我不希望每次有新信息时页面都要刷新。

我不知道在哪里放置后台脚本,rails将如何调用它等等。

我该怎么做?

1 个答案:

答案 0 :(得分:2)

有许多方法可以在构造方面达到您想要的结果,但最终您将使用Javascript和AJAX调用,因为没有其他方法可以使用抓取的数据更新页面上的内容。

以下是我如何使用AJAX和屏幕抓取来实现RoR:

<强>的application.js

在我们的应用程序JS文件中,我们在字段上监听它何时被更改(用户输入web url或某种数据),然后我们对我们的scraper进行AJAX调用(以后在Routes.rb中设置url)并且我们的数据以JSON格式返回(当调用AJAX的成功触发器时),我们循环并在两个字段中显示已删除的数据,这两个字段以与JSON键值对相似的格式命名。

$('#item_url').live('change', function() {          
     $.ajax({
            url: "/scrape/siteandnum", 
            data: {item_url: document.getElementById('item_url').value},             
            dataType: 'json', 
            success: function(data) {                                                               
                    $.each(data, function(key, value) {                        
                        document.forms['new_qued_item'].elements['qued_item_' + key].value = value
                    });         
                }
            });
}); 

<强> qued_items_controller.rb

在我们的控制器中,我们有一个方法,它是Ruby scrape代码。它接受了item_url的params(从AJAX调用的数据传入) - 在这个例子中,它接收了一个eBay拍卖URL,并为我们提供了eBay站点域和项目号。

def scrape_site_and_num
    url = params[:item_url] 
    itemnumber = url.match(/\d{12}/)[0].to_i 
    site = url.match(/ebay.(co.uk|com|de|fr|it|ca)/)[0]

    render :json => {'itemnumber' => itemnumber, 'site' => site}
end 

<强>的routes.rb

当然我们必须有一个路由,以便AJAX调用知道访问我们的scrape方法的位置。

  get "scrape/siteandnum/" => "qued_items#scrape_site_and_num"

所以你有它。使用此方法可以输入任何类型的数据,并且“幕后”Ruby方法将处理用户输入并返回一些屏幕抓取数据,而不会重新加载页面!