我想要创建与我想要创建的帖子相关的类别。我不想添加宝石或其他任何我认为我们可以使用has_many
和belongs_to
我创建了两个表帖子和类别,我想在一个集合中选择一个类别,这是在我想要创建的新#view视图和后期节目#view和post index #view上写的。
帖子的模型是:
class Post < ActiveRecord::Base
belongs_to :user
belongs_to :category
TAGS = ["Design", "Mode", "Tendance", "Life-Style", "Tradition", "Gastronomie", "Insolite", "Technologie"]
validates :tag, inclusion: { in: Post::TAGS, allow_nil: false }
mount_uploader :cover, ImageUploader
end
和类别是帖子的外键,这里是模型
class Category < ActiveRecord::Base
has_many :posts
NAMES = ["JAPON", "CHINE", "INDE"]
validates :name, inclusion: { in: Category::NAMES, allow_nil: false }
end
帖子控制器在这里
class PostsController < ApplicationController
before_filter :authenticate_user!, except: [:index, :show]
before_action :find_post, only: [:show, :edit, :update, :destroy]
def index
@posts = Post.all
end
def show
# @alert_message = "Vous lisez #{@post.title}"
end
def new
# if current_user and current_user.admin?
@post = Post.new
# else
# redirect_to posts_path
# end
end
def create
# if current_user and current_user.admin?
@post = current_user.posts.new(post_params)
#@post = current_user.posts.new(post_params)
if @post.save
redirect_to @post
else
render :new
end
# else
# render 'shared/404.html.erb'
# end
end
def edit
end
def update
if @post.update(post_params)
redirect_to @post
else
render :edit
end
end
def destroy
@post.destroy
redirect_to :back
end
private
def find_post
@post = Post.find(params[:id])
end
# def set_category
# @post_category = Category.find(params[:category_id])
# end
def post_params
params.require(:post).permit(:title, :subtitle, :introduction, :body, :cover, :tag, :category_id)
end
end
和categories_controller
在这里
class CategoriesController < ApplicationController
before_action :set_category, only: [:show, :new, :create, :destroy]
def show
@category = Category.find(params[:id])
end
def index
@categories = Category.all
end
def create
@category = Category.new(category_params)
if @category.save
redirect_to @post
else
render :new
end
end
def new
@category = Category.new
end
def edit
end
def update
end
def destroy
@category = Category.find(params[:id])
@category.destroy
redirect_to post_path(@post)
end
private
# def set_post
# @post = Post.find(params[:post_id])
# end
# def set_category
# @category = Category.find(params[:category_id])
# end
def set_category
if params[:id].present?
@category = Category.find(params[:id])
else
@category = Category.new
end
end
# def find_category
# @category = Category.find(params[:id])
# end
def category_params
params.require(:category).permit(:name, :description)
end
end
请你能否展示一个正确的方法来添加我在收藏中选择的类别,并在新的#view show#view index#view中显示。 谢谢你的帮助。
答案 0 :(得分:0)
如果某个类别可以属于多个帖子,我建议您为数据模型使用has_may_through关系。
class Post
has_many :post_categories
has_many :categories, through: post_categories
accepts_nested_attributes_for :categories
end
class Category
has_many :post_categories
has_many :posts, through: post_categories
end
class PostCategory
belongs_to :posts
belongs_to :categories
end
您需要创建一个迁移来添加&#39;通过&#39; table,PostCategory,由post_id和category_id组成。
在控制器中
def new
@post = Post.new
@post.categories.build
end
def post_params
params.require(:post).permit(:title, :subtitle, :introduction, :body, :cover, :tag, category_ids: [])
end
在表单中,您可以使用fields_for构建类别表单。
如果全部设置完毕,rails将在创建帖子时处理类别的创建。然后,您将能够调用category.posts以获取该类别的所有帖子,您可以调用post.categories以获取分配给该帖子的所有类别。
答案 1 :(得分:0)
可以使用Post
的{{1}}方法将Category
分配给create
。您已经通过PostsController
将category_id
传递给控制器。
params
当您在视图中尝试def create
@post = current_user.posts.new(post_params)
@category = Category.find(params[:category_id])
if @post.save && (@category.posts << @post)
redirect_to @post
else
render :new
end
end
帖子时,您应该能够直接访问show
。
category
如果您允许在没有类别的情况下创建某些帖子,则无法显示任何内容,或显示“无类别”消息。
<%= post.category.name %>