Qiita初投稿なので、間違っていたら、ガンガンご指摘ください!
TL;DR
Railsを使ってアプリケーションを作るときは
ストロングパラメータを通さないと、Railsさんから怒られる仕様になっています。(Rails ver4以降)
「モデルのカラムをそのままフィールドにするんでしょ?」みたいな勘違いや、ブラックボックス化されている気がして、初心者が打破するのはかなり難しい気がするので、少し記事にまとめていきたいです!
あくまで、対象は初心者の方です!
ストロングパラメータの意味
僕も正確に理解しているわけではないですが、
「送られて来たparameterの中で許容するフィールドを絞るメソッド」
と認識しています。
例を挙げて説明していきます。
普通のストロングパラメータ
blogsテーブルのカラムはcontentとimageの二つを考えます!
def create
@blog = Blog.new(blog_params)
@blog.save
render :create, formats: :json
end
private
def blog_params
params.require(:blogs).permit(
:content,
:image
)
end
みたいな感じだと思います!
このとき、クライアントからのパラメータで許容されるのは、
{
blogs: {
content: "あの映画、面白かった",
image: "https://image.png"
}
}
この形で送られて来たパラメータできます!
このとき例えば、以下のように titleフィールドを追加して、送ったとします!
{
blogs: {
title: "映画", # => これを追加
content: "あの映画、面白かった",
image: "https://image.png"
}
}
もし、これを送っても
{
blogs: {
content: "あの映画、面白かった",
image: "https://image.png"
}
}
だけです!
要は、ふるいにかけています!
ストロングパラメータは、ふるいにかけるためのメソッドという事です!
なので、DBのカラムと直接的な関係はないです!
CTI用のストロングパラメータ
さきほどの設計だと、Blogsテーブルの一つのレコードに、一つのimageしか付与する事ができません。
そのため、今回は
BlogsテーブルとBlogImagesテーブルと2つのテーブルを考えます!
また、この二つのアソシエーションは1対多を考えます。
Blogsテーブルのカラムは content、
BlogImagesのテーブルのカラムは image とします。
このときのストロングパラメータは、
private
def blog_params
params.require(:blogs):permit(
:content,
blog_images: [
:image
]
)
end
このとき、以下を送ると通ると思います。
{
blogs: {
content: "あの映画、面白かった",
blog_images: [
{ image: "https://image1.png" },
{ image: "https://image2.png" }
]
}
}
これで、一回のリクエストで、
一つのBlogに複数のimageを付け加える事ができました。