前提・実現したいこと
新規投稿をするときに、セレクトボックスを用いて、カテゴリー機能を実装したいです。
##状況
railsで個人アプリを開発中で、スノボー版インスタグラムを作成しています。
現在の状況としては、投稿機能はカテゴリー以外は実装されています。
(image,text,titleなど)
また、中間テーブルであるpost_categoryテーブルの紐付けがうまく行っていないのか、新規投稿される時にpost_idとcategory_idはデータベースに登録されずです。
該当のソースコード
posts/new.html.haml
ruby
1- if @post.errors.any? 2 .alert 3 %ul 4 - @post.errors.full_messages.each do |message| 5 %li= message 6 7#account-page.account-page 8 .account-page__inner.clearfix 9 .post-new-edit-page 10 = render partial: 'form'
_form.html.haml
= form_for(@post) do |f| .field .field-label = f.label :title, "snowB" .field-input = f.text_field :title .field .field-label = f.label :body, "ココがポイント!" .field-input = f.text_area :body .field .field-label = f.label :image, "snowB写真" .field-input = f.attachment_field :image .field .field-label = f.label :category, "カテゴリーを選択してください" .field-input = f.select :category_ids, options_for_select( @category_parent_array.map{|c| [c, {}]}), {}, {class: "parent_select", id: "parent_category"} .actions = f.submit "投稿する", class: "btn"
posts_cotllor.rb
class PostsController < ApplicationController before_action :authenticate_user!, except: [:index] before_action :set_category, only:[:new, :create] def index @posts = Post.all @category_parent_array = Category.where(ancestry: nil) end def show @post = Post.find(params[:id]) @comment = Comment.new @comments = @post.comments.includes(:user) end def new @post = Post.new end def get_category_children @category_children = Category.find("#{params[parent_id]}").children end def create @post = Post.new(post_params) @post.user_id = current_user.id if @post.save redirect_to post_path(@post), notice: '投稿されました' else render :new, alert: '投稿できませんでした' end end def edit @post = Post.find(params[:id]) if @post.user != current_user redirect_to posts_path, alert: '不正なアクセスです' end end def update @post = Post.find(params[:id]) if @post.update(post_params) redirect_to post_path(@post), notice: '投稿が更新されました' else render :edit end 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, :image, { post_categories: {} }) end def set_category @category_parent_array = [] Category.where(ancestry: nil).each do |parent| @category_parent_array << parent.name end end end
##アソシエーション
post.rb
class Post < ApplicationRecord belongs_to :user attachment :image has_many :favorites, dependent: :destroy has_many :comments with_options presence: true do validates :title validates :body validates :image end has_many :post_categories, dependent: :destroy has_many :categories, through: :post_categories accepts_nested_attributes_for :categories, allow_destroy: true end
category.rb
class Category < ApplicationRecord has_ancestry has_many :post_categories, dependent: :destroy has_many :posts, through: :post_categories end
post_category.rb
class PostCategory < ApplicationRecord belongs_to :post belongs_to :category end
db/seeds.rb
snowboard = Category.create(name: "スノーボード") snowboard_1 = snowboard.children.create([ {name: "BURTON"}, {name: "K2"}, {name: "SALOMON"}]) snowboots = Category.create(name: "ブーツ") snowboots_1 = snowboots.children.create([ {name: "BURTON"}, {name: "DEELUXE"}, {name: "FLUX"}])
足りない情報があれば教えてください。
なんでカテゴリーが登録されないんでしょうか?