ブログ記事の投稿フォームでDBに格納したいと思っています。
DBは「ブログ本体のDB」と「カテゴリー用のDB」の2つがあります。
投稿フォームで、ブログタイトルや本文のフォームとカテゴリーを選択するフォーム、2つのフォームがあり、
カテゴリーフォームは「カテゴリー用のDB」から参照し、 collection_select
でプルダウン表示させています。
buildメソッドや accepts_nested_attributes_for
などを記述し、2つのフォームの関係性を認識させようとしましたが、
NoMethodError in BlogsController#new undefined method `blogcategories' for nil:NilClass @blog.blogcategories.build
とエラー表示され、うまくできません。
様々なサイトを見て同じように buildメソッド
を書いたのですがなぜこうなるのかよくわからずいまいちピンとこないので、ご指摘いただければ助かります。
また、DBの関係は1つの記事につき、1つのカテゴリーしか参照できませんが、カテゴリーからはいくつもの記事に参照できる「1対多」の関係です。
###blogs_controller.rb
createアクションは手をつけていません。
ruby
1def new 2 @blog.blogcategories.build 3 4 @dbsort = Blogcategory.new # カテゴリーの表示 5end 6 7 8def create 9 @blog = Blog.new(blog_params) 10 11 respond_to do |format| 12 if @blog.save 13 format.html { render :index } 14 format.json { render :show, status: :created, location: @blog } 15 else 16 format.html { render :new } 17 format.json { render json: @blog.errors, status: :unprocessable_entity } 18 end 19 end 20end 21 22 23private 24 def blog_params 25 params.require(:blog).permit(:blogtitle, :blogcategory_id, :content, blogs_attributes[:blogcategory_id]) 26 end
###/views/blogs/new.html.erb
投稿フォームのview
カテゴリーの部分はプルダウン(select)で表示させています。
ruby
1<h1>ブログを投稿する</h1> 2 3 <%= form_for(@blog) do |f| %> 4 <% if @blogchou.errors.any? %> 5 <div id="error_explanation"> 6 <h2><%= pluralize(@blog.errors.count, "error") %> prohibited this blog from being saved:</h2> 7 8 <ul> 9 <% @blog.errors.full_messages.each do |message| %> 10 <li><%= message %></li> 11 <% end %> 12 </ul> 13 </div> 14 <% end %> 15 16 <%= f.text_field :blogtitle, placeholder: 'ブログタイトル' %> 17 18 <%= form_for @dbsort do |c| %> 19 <%= c.collection_select :id, Blogcategory.all, :id, :category %> 20 <% end %> 21 22 <%= f.text_field :content, placeholder: 'ブログの内容' %> 23 24 <%= f.submit 'ブログを投稿する' %></div> 25 <% end %> 26
###/models/blogcategory.rb
カテゴリー用DBのモデル
ruby
1class Blogcategory < ApplicationRecord 2 has_many :blogs 3 accepts_nested_attributes_for :blogs, allow_destroy: true 4end
###/models/blog.rb
ブログ本体DBのモデル
ruby
1class Blog < ApplicationRecord 2 belongs_to :blogcategory 3end
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/27 17:47