作为一个学校项目,我应该创建一个任务管理器应用程序。我到了那里,但我似乎无法弄清楚的一件事是: 我有3个模型:任务,类别和标签。一项任务只有一个类别,但有很多标签。我们应该能够按类别过滤任务,这样,当您选择类别时,您将被重定向到/ tasks / by-category / category_id。 By_category没有模型,只有task文件夹中的视图。
我的路线:
resources :tasks do
collection do
get 'net_connection', action: :net_connection
get 'completed'
get 'pending'
get 'by-category', action: :by_category, :as => :by_category
get 'search'
delete 'destroy_multiple'
end
member do
delete 'delete'
end
index.html.erb在任务中:
<div>
<%= simple_form_for :by_category, url: by_category_tasks_path, method: :get do |f| %>
<%= f.input :category, collection: Category.all, label_method: :title, value_method: :id,label: "Category", include_blank: true %>
<%= f.submit "Filter by category" %>
<%end%>
</div>
任务控制器:
def by_category
end
如何将类别ID提交到按类别的URL?
答案 0 :(得分:0)
Rails实现此目的的方法是创建一个嵌套资源:
resources :categories, only: nil do
resources :tasks, only: :index
end
这将创建一条/categories/:category_id/tasks
路线。您可以修改常规的TasksController#index
操作:
class TasksController
# GET /tasks
# GET /categories/1/tasks
def index
if params[:category_id]
@category = Category.includes(:tasks)
.find(params[:category_id])
@tasks = @category.tasks
else
@tasks = Task.all
end
end
end
或创建一个单独的嵌套控制器:
resources :categories, only: nil do
resources :tasks, only: :index, module: :categories
end
module Categories
class TasksController
# GET /categories/1/tasks
def index
@category = Category.includes(:tasks)
.find(params[:category_id])
@tasks = @category.tasks
end
end
end
使用表单是多余的,因为您仅使用路径中发送的单个参数创建一个简单的GET请求。只需为每个类别创建一个链接:
<%= link_to category.name, [category, :tasks] %>
如果您真的必须创建一个表单,可以使用以下方法完成:
<%= form_tag tasks_path do |f| %>
<%= select_tag('category_id', options_from_collection_for_select(Category.all, 'title', 'id')) %>
<%= submit_tag "Filter by category" %>
<% end %>