#やりたいこと
Rails5.1.1
- ArticleモデルとCategoryモデルが既にある状態で、ArticleにCategoryをbelongs_toで紐付けたい。
- ArticleモデルのフォームでCategoryを選択できるようにしたい
#ArticleにCategoryへの外部キーを追加
###Articleモデルに外部キーカラムを追加
category:references
と指定することで、自動的にcategory_id
カラムを追加してくれる。
category_id:referencesとやってしまうと、category_id_idというカラム名になってしまうので注意。
$ rails g migration add_category_to_article category:references
###migration実行
$ rails db:migrate
###一対多の関係を追記
複数のArticleでひとつのCategoryを使うので、こう。
class Article < ApplicationRecord
belongs_to :category
end
class Category < ApplicationRecord
has_many :articles
end
###seeds.rbを使う場合
Articleを先に生成してしまうと、category_idがないよっていうエラーになるので注意。
Category.create!(content: content)
Article.create!(title: title, category_id: 1)
$ rails db:migrate:reset
$ rails db:seed
#フォームで編集できるようにする
※編集の場合
コントローラーは、普通に取得でOK
def edit
@article = Article.find(params[:id])
end
View側は今回セレクトボックスを使う引数は、
articleに追加したcategory_id
、フォームに表示したい要素群
、valueの値
、フォームに表示される文章
、オプション
<%= f.collection_select(:category_id, Category.all, :id, :content, :prompt => true) %>
今回のオプション:promt => true
は、未選択時「Please select」を出すもの。newアクションでもこのまま使える
#注意点
strong parametersにcategory_id追加を忘れないこと
def article_params
params.require(:article).permit(:title, :category_id)
end