我需要有人指导我为我的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
答案 0 :(得分:0)
IMO你对两个不同的问题感到困惑:
Post
与许多Categories
<强>帖子强>
如果您希望自己的帖子包含多个类别,则可以使用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
这样,您就可以根据需要将任何post
与categories
个关联起来。有很多方法可以做到这一点,但最简单的方法是使用<<
ActiveRecord function:
#app/controllers/posts_controller.rb
def add_category
@post = Post.find(params[:id])
@post.categories << Category.find(params[:category_id])
end
<强>层次强>
因为您将categories
与posts
分开,所以您可以使用ancestry
之类的gem来为其提供层次结构
与标签不同,我认为类别主要是固定的,这意味着您可以在后端执行您想要的操作,为用户提供结构化选择