如何合并这两个def索引

时间:2016-12-25 01:54:22

标签: ruby-on-rails

我有2个不同的<?php $title = 'Home'; $childView = 'views/_index.php'; include('layout.php'); ?> 行动,有人可以帮我合并吗?

第一个def索引(对于标签):

index

第二个def索引(针对类别):

def index
  if params[:tag]
    @posts = Post.tagged_with(params[:tag])
  else
    @posts = Post.all
  end
end

3 个答案:

答案 0 :(得分:0)

我使用ransack进行过滤和排序:https://github.com/activerecord-hackery/ransack

它非常容易设置,可以实现您的目标。

答案 1 :(得分:0)

这样的事情会做

def index
  if params[:tag].present?
    @posts = Post.tagged_with(params[:tag])
  elsif params[:category].present?
    @category = Category.find_by_name(params[:category])
    @posts = @category.posts       
  else
    @posts = Post.all
  end
end

答案 2 :(得分:0)

这是一个简短的版本:

def index
  @posts =
    if params.key?(:tag)
      Post.tagged_with(params[:tag])
    elsif params.key?(:category)
      Post.joins(:categories).where(categories: { name: params[:category] })
    else
      Post.all
    end
end

但是,我想知道这种情况是否真的保证了3种不同的路线和控制器:

# config/routes.rb
resources :categories, only: [] { resources :posts, only: :index }
resources :tags, only: [] { resources :posts, only: :index }
resources :posts, only: :index

然后

# categories_posts_controller.rb
class CategoriesPostsController < ApplicationController
  def index
    @posts = Post.joins(:categories).where(categories: { id: params[:category_id] })
  end
end

等等:

# tags_posts_controller.rb
class TagsPostsController < ApplicationController
  def index
    @posts = Post.tagged_with(params[:tag_id])
  end
end

如果您没有可以使用的id,则可以将路线中的参数名称更改为您想要的任何名称。

resources :categories, only: [] { resources :posts, only: :index, param: :name }