0

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

如果该解决方案允许用户单击多个并在提要中显示两个类别的帖子,则可以加分。

提前致谢!

楷模:

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
})

我的观点只是做一个@projects.each 做|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

但是,当我对其进行测试并单击“食品”类别的选项卡时,什么也没有发生,并且出现 500 内部服务器错误。

4

1 回答 1

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 目录中有一个文件(不管它在哪里—— 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。

于 2012-10-05T08:03:28.657 回答