为帖子创建类别

时间:2014-01-25 02:18:25

标签: ruby-on-rails

我需要有人指导我为我的Post模型生成类别。我想在顶部有一个主导航栏,在侧边栏部分有所有类别和多个子菜单。

我阅读了多篇帖子,发现我可以为我的类别生成多个模型或使用标签。我已经创建了标记模型,但不确定如何使用它创建树结构。

----- ----------编辑

我已经尝试过使用Acts-As-Taggable-On Gem并为我的Post模型创建标签。但不确定如何使用它来创建导航和侧边栏的类别。

///// -----编辑2 --------- ///

视图/ application.html.erb

<ul>
  <% Tag.roots.each do |tag| %> 
    <li><%= link_to tag.name, tag_path(tag) %></li>
  <% end %>
</ul>

这将形成Tag根节点列表。当我点击其中一个标签时,我收到以下错误:

Started GET "/tags/1" for 127.0.0.1 at 2014-01-25 01:23:48 -0500
Processing by PostsController#index as HTML
  Parameters: {"tag"=>"1"}
  Tag Load (0.3ms)  SELECT "tags".* FROM "tags" WHERE "tags"."name" = '1' LIMIT 1
Completed 404 Not Found in 3ms

ActiveRecord::RecordNotFound (ActiveRecord::RecordNotFound):
  app/models/post.rb:6:in `tagged_with'
  app/controllers/posts_controller.rb:23:in `index'

这是我为路线准备的: 的routes.rb

  get 'tags/:tag', to: 'posts#index', as: :tag

我还包括posts_controller.rb:

class PostsController < ApplicationController


  def new
    @post = Post.new
  end

  def create
    @post = Post.new(post_params)
    if @post.save(params[:post].permit(:title, :body, :tag_list))
      redirect_to @post
    else 
      render 'new'
    end
  end

  def show
    @post = Post.find(params[:id])
  end

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

  def update 
    @post = Post.find(params[:id])

    if @post.update(params[:post].permit(:title, :body, :tag_list))
      redirect_to @post
    else
      render 'edit'
    end
  end

  def edit
    @post = Post.find(params[:id])
  end

  def destroy
    @post = Post.find(params[:id])
    @post.destroy 

    redirect_to posts_path
  end

  private
    def post_params
      params.require(:post).permit(:title, :body, :tag_list)
    end
end

1 个答案:

答案 0 :(得分:0)

IMO你对两个不同的问题感到困惑:

  1. Post与许多Categories
  2. 相关联
  3. 类别层次结构

  4. <强>帖子

    如果您希望自己的帖子包含多个类别,则可以使用HABTM关联:

    #app/models/post.rb
    Class Post < ActiveRecord::Base
         has_and_belongs_to_many :categories
    end 
    
    #app/models/category.rb
    Class Category < ActiveRecord::Base
         has_and_belongs_to_many :posts
    end
    

    您需要创建一个categories_posts这样的表(Rails 3 has_and_belongs_to_many migration):

    #db/migrate/your_migration.rb
    create_table :categories_posts, :id => false do |t|
        t.references :categories
        t.references :posts
     end
    

    这样,您就可以根据需要将任何postcategories个关联起来。有很多方法可以做到这一点,但最简单的方法是使用<< ActiveRecord function

    #app/controllers/posts_controller.rb
    def add_category
        @post = Post.find(params[:id])
        @post.categories << Category.find(params[:category_id])
    end
    

    <强>层次

    因为您将categoriesposts分开,所以您可以使用ancestry之类的gem来为其提供层次结构

    与标签不同,我认为类别主要是固定的,这意味着您可以在后端执行您想要的操作,为用户提供结构化选择