使用Ajax在jQuery click事件上过滤Rails数据库?

时间:2012-10-05 06:40:20

标签: jquery ruby-on-rails ajax

我有表项目,它们属于许多类别。在主页面上,我显示所有项目。每个类别都有一个点击事件,我希望数据库按该类别过滤项目。有人可以用一个框架来帮我完成这个吗?我是AJAX的初学者,更不用说jquery / rails了。

如果该解决方案允许用户点击多个并在Feed中显示两个类别的帖子,则会获得积分。

提前致谢!

型号:

class Project < ActiveRecord::Base
  attr_accessible :id, :filename, :location, :uploaded_file, :project_id, :category_id
  has_and_belongs_to_many :categories
  def to_hash
    {
      :id => self.id,
      :filename => self.filename,
      :location => self.location,
    }
  end
end

class Category < ActiveRecord::Base
  attr_accessible :name, :id, :category_id, :project_id
  has_and_belongs_to_many :projects
    def to_hash
    {
      :id => self.id,
      :name => self.name
    }
  end
end


class Category_Project < ActiveRecord::Base
  attr_accessible :project_id, :category_id
  belongs_to :project
  belongs_to :category
  def to_hash
    {
      :project_id => self.project_id
      :category_id => self.category_id
    }
  end
end

我的jQuery onclick函数中的AJAX调用。 “cat”是其中一个已建立的类别名称的名称。

...
    params = 'category_name=' + cat;
        $.ajax({
            url: "/projects_controller/filter_list",
            data: params
})

我的观点只是做了@project.each do | project |功能

projects_controller中的相关函数:

def filter_list
     @projects = Project.includes(:categories).where("categories.name = ?", params[:category_name])
    respond_to do |format|
      change_color.js /// Is this right?? This is same .js file my onclick event is in.
     end  
end

但是,当我测试它并单击“Food”类别的选项卡时,没有任何反应,我收到500内部服务器错误。

1 个答案:

答案 0 :(得分:2)

有几种方法可以做到这一点。更加困难的方法是让你的ajax调用返回一个然后执行的js脚本。

首先,将您的ajax调用更改为以下

params = 'category_name=' + cat;
$.ajax({
    url: "/projects_controller/filter_list",
    data: params,
    dataType: 'script'
});

这告诉jQuery期望从服务器返回javascript文件并在检索后执行它。您可以用

替换它
$.getScript('/projects_controller/filter_list?category_name=' + cat);

改变你的控制器respond_to阻止如下:

respond_to do |format|
  format.js
end  

现在,您需要在您的视图目录中找到filter_list.js.erb文件(无论它在哪里 - views/projects/filter_list.js.erb?)。

假设您的项目/索引如下所示:

<div class="projects">
<% @projects.each do |project| %>
  <%= render project %>
<% end %>
</div>

您需要在新的js.erb文件中添加以下内容:

$('.projects').empty();
<% @projects.each do |project| %>
  $('.projects').append("<%= escape_javascript render(project) %>");
<% end %>

这将使用控制器中的新(过滤)项目模板替换当前页面上的项目div。