我有表项目,它们属于许多类别。在主页面上,我显示所有项目。每个类别都有一个点击事件,我希望数据库按该类别过滤项目。有人可以用一个框架来帮我完成这个吗?我是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内部服务器错误。
答案 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。