在Rails中部分重新加载页面

时间:2015-11-02 01:58:18

标签: ruby-on-rails ajax

我在Rails开发音乐网站。登录页面被划分并有一个搜索表单,您可以在其中查找存储在数据库中的频段。在另一个部门里面,我嵌入了播放一些随机视频的播放器。我希望搜索结果显示在同一个目标网页上。

当我提交表单时,页面重新加载并且播放器也重新加载并开始播放不同的视频。我实际想要实现的是在提交搜索表单时玩家不会被打断。

不知道我希望它是否以及如何实现。如果我做对了this link描述了一种方法,但我没有让它发挥作用。

家庭控制器

def index
  @bands = Band.search(params[:search]).order("name ASC")
  @random_band = Band.order("RANDOM()").limit(1) 
end

def preview
  @bands = Band.search(params[:search]).order("name ASC")
  render :partial => 'preview', :content_type => 'text/html'
end

_preview.html.erb

<table class="table"  
  <tr>
    <th>Title</th>
    <th>Year</th>
  </tr>
  <% @bands.each do |f| %>
    <tr>
      <td>
        <%= f.name %>
      </td>
    </tr>
  <% end %>
</table>

家#索引

<!DOCTYPE html>
  <html lang="en">

    <form class="navbar-form navbar-left" role="search">
      <%= form_tag({:action => 'preview'}, id: "search-form", :remote => true, :'data-update-target' => 'update-container') do %>
      <%= text_field_tag :search, params[:search], placeholder: "Search Bands" %>
      <%= submit_tag "Search" %>
      <% end %>
     </form>



<div class="row">
  <div class="col-md-6">

    <div id="update-container">
      <%= @random_band.first.name %>
    </div>

    </div>
    <div class="col-md-6">
      <%= video_tag("#{@random_band.first.name}.mp4", size: "460x390",
        controls: true, autobuffer: true, autoplay: true) %>
   </div>
 </div>


</html>

的application.js

$(function() {
/* Convenience for forms or links that return HTML from a remote ajax call.
The returned markup will be inserted into the element id specified.
 */
$('form[data-update-target]').live('ajax:success', function(evt, data) {
    var target = $(this).data('update-target');
    $('#' + target).html(data);
  });
});

第一个问题:表单似乎没有找到预览操作。

第二个问题:如果我使用预览操作更改索引的内容,它确实会发现预览操作,但它不会在更新容器内呈现搜索结果。相反,它将它们呈现为一个完整的新页面。

顺便说一下,我对Rails了解了一下,但我对Ajax没有任何经验。

1 个答案:

答案 0 :(得分:5)

据我所知,你的大部分代码都非常扭曲而且并不是非常精益。在不重新加载页面其余部分(包括您的播放器)的情况下,更新搜索结果的简短且非常精简的方式可能如下所示。索引函数应如下所示:

//bands_controller.rb
def index
  @bands = Band.search(params[:search])
end

您必须在Band-Model中创建搜索方法:

//Band.rb
def self.search(search)
  if search
    find(:all, :conditions => ['name LIKE ?', "%#{search}%"])
  else
    find(:all)
  end
end

您需要在视图内某处具有特定ID的div中呈现_preview.html.erb:

<div id="bands"><%= render 'preview' %></div>

你的form_tag有很多你不再需要的论据:

<%= form_tag bands_path, :method => 'get', :id => "search_form" do %>
    <%= text_field_tag :search, params[:search] %>
    <%= submit_tag "Search", :name => nil %>
<% end %>

我用于表单的jquery看起来像这样..在我看来非常简单:

$(function() {
  $("#search_form input").keyup(function() {
    $.get($("#search_form").attr("action"), $("#search_form").serialize(), null, "script");
    return false;
  });
});

每次在搜索字段中输入一个字母时,都会触发index.js.erb(你必须创建它):

//index.js.erb (same folder as index.html.erb)
$("#bands").html("<%= escape_javascript(render("preview")) %>");

这应该刷新你的div。这可能是一项小工作,但这是在我能想到的索引页面中实现ajax搜索功能的最简单方法。

来源: Railscast#27 Railscast#240