Ruby on rails 使用集合为HABTM关系中的对象选择视图辅助对象
模型项目和类别处于一个has\u和\u属于\u-to\u-many关系中。下面的部分视图用于不同的视图,以显示包含所有可用类别的下拉菜单。下拉菜单下方列表中的项目根据用户在下拉菜单中的选择显示 除了其他类别之外,还有一个名为“一切”的类别,每个项目都是该类别的成员。它也是category db表中的第一个条目,因为它是在将迁移加载到数据库时插入的 现在没有错误,但无论我选择哪个类别,它都会重新加载显示“所有内容”类别的页面 你知道我需要在下面提到的代码中修改什么才能让它按照我想要的方式工作吗?谢谢你的帮助 部分,带有下拉菜单和项目列表Ruby on rails 使用集合为HABTM关系中的对象选择视图辅助对象,ruby-on-rails,Ruby On Rails,模型项目和类别处于一个has\u和\u属于\u-to\u-many关系中。下面的部分视图用于不同的视图,以显示包含所有可用类别的下拉菜单。下拉菜单下方列表中的项目根据用户在下拉菜单中的选择显示 除了其他类别之外,还有一个名为“一切”的类别,每个项目都是该类别的成员。它也是category db表中的第一个条目,因为它是在将迁移加载到数据库时插入的 现在没有错误,但无论我选择哪个类别,它都会重新加载显示“所有内容”类别的页面 你知道我需要在下面提到的代码中修改什么才能让它按照我想要的方式工作吗?谢
<!-- category dropdown -->
<% form_for category_url(:id), :html => {:method => :get} do |f| %>
<label>Categories</label>
<%= f.collection_select(:category_ids , Category.find(:all), :id , :name) %>
<%= f.submit "Show" %>
<% end %>
<!-- project list -->
<ul class="projectlist">
<% @projects.each do |_project| %>
<li>
<%= link_to(_project.name, _project) %>
</li>
<% end %>
</ul>
category GET /categories/:id {:controller=>"categories", :action=>"show"}
<% form_tag(filter_category_path(:id), :method => :post, :class => 'categories') do %>
<label>Categories</label>
<%= select_tag(:category, options_for_select(Category.all.map {|category| [category.name, category.id]}, @category.id)) %>
<%= submit_tag "Go" %>
<% end %>
<ul class="projects">
<% @projects.each do |_project| %>
<li>
<%= link_to(_project.name, _project) %>
</li>
<% end %>
</ul>
类别模型
class Category < ActiveRecord::Base
has_and_belongs_to_many :projects, :join_table => "categories_projects"
end
class Project < ActiveRecord::Base
has_and_belongs_to_many :categories, :join_table => "categories_projects"
end
您正在传递一个名为
:category\u ids
的参数,但您无法在任何地方访问该参数
form_for category_url(:id)
这会将您的表单提交到路径/categories/1
或您当前查看的任何id。然后使用该:id
查找类别项目:
@projects = Category.find(params[:id]).projects.find(:all)
所以你只是把同样的东西再看一遍。因为它是一个表单,所以您提交的查询带有:category\u id参数:
POST /categories/1?category_ids=2
您可以更改Category.find,改为使用其他参数。但是,通常要查看类别2,您只需使用url/categories/2
,其中2是您的:id参数。在该路径中有两个ID,您应该决定如何解决该问题
一个选项是对表单操作使用categories\u路径
,并将collection\u select:category\u id参数更改为just:id
:
/categories?id=2 # from the form
/categories/2 # from a link
但是,如果您只是列出项目,我会将此逻辑移到项目控制器(索引操作)中,因此您的URL如下所示:
/projects?category_id=2` # from the form
/categories/2/projects # from a link
谢谢安德鲁,但我自己解决了这个问题: 我去掉了collection_select,改为select,添加了过滤操作(在config/routes.rb中使用相应的路由),现在一切都按照我的预期工作 …我试图在“选择”菜单上找到一个观察者,当用户更改“选择”菜单中的选择时,该观察者会将其值提交到“筛选”操作,但这是另一回事。;-) 带有下拉菜单和项目列表的新部分
<!-- category dropdown -->
<% form_for category_url(:id), :html => {:method => :get} do |f| %>
<label>Categories</label>
<%= f.collection_select(:category_ids , Category.find(:all), :id , :name) %>
<%= f.submit "Show" %>
<% end %>
<!-- project list -->
<ul class="projectlist">
<% @projects.each do |_project| %>
<li>
<%= link_to(_project.name, _project) %>
</li>
<% end %>
</ul>
category GET /categories/:id {:controller=>"categories", :action=>"show"}
<% form_tag(filter_category_path(:id), :method => :post, :class => 'categories') do %>
<label>Categories</label>
<%= select_tag(:category, options_for_select(Category.all.map {|category| [category.name, category.id]}, @category.id)) %>
<%= submit_tag "Go" %>
<% end %>
<ul class="projects">
<% @projects.each do |_project| %>
<li>
<%= link_to(_project.name, _project) %>
</li>
<% end %>
</ul>
:post,:class=>“categories”)do%>
类别
-
新类别控制器
class CategoriesController < ApplicationController
def show
@projects = Category.find(params[:id]).projects.find(:all)
respond_to do |format|
format.html # show.html.erb
end
end
end
class ProjectsController < ApplicationController
def show
@projects = Project.find(:all)
@project = Project.find(params[:id])
respond_to do |format|
format.html # show.html.erb
end
end
def index
@projects = Project.find(:all)
respond_to do |format|
format.html # index.html.erb
end
end
end
class CategoriesController < ApplicationController
def show
@category = Category.find(params[:id])
@projects = @category.projects.find(:all)
respond_to do |format|
format.html
end
end
def filter
@category = Category.find(params[:category])
@projects = @category.projects.find(:all)
respond_to do |format|
format.html
end
end
end
class CategoriesController