在Rails中按类别“过滤”结果

时间:2019-12-08 15:34:20

标签: ruby-on-rails simple-form

作为一个学校项目,我应该创建一个任务管理器应用程序。我到了那里,但我似乎无法弄清楚的一件事是: 我有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?

1 个答案:

答案 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 %>