为rails中的类别创建has_many:posts

时间:2016-04-20 19:06:36

标签: ruby-on-rails

我想要创建与我想要创建的帖子相关的类别。我不想添加宝石或其他任何我认为我们可以使用has_manybelongs_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中显示。 谢谢你的帮助。

2 个答案:

答案 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。您已经通过PostsControllercategory_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 %>