LoginSignup
6
1

More than 5 years have passed since last update.

Rails CTI用のストロングパラメータ

Last updated at Posted at 2018-10-25

Qiita初投稿なので、間違っていたら、ガンガンご指摘ください!

TL;DR

Railsを使ってアプリケーションを作るときは
ストロングパラメータを通さないと、Railsさんから怒られる仕様になっています。(Rails ver4以降)

「モデルのカラムをそのままフィールドにするんでしょ?」みたいな勘違いや、ブラックボックス化されている気がして、初心者が打破するのはかなり難しい気がするので、少し記事にまとめていきたいです!

あくまで、対象は初心者の方です!

ストロングパラメータの意味

僕も正確に理解しているわけではないですが、

「送られて来たparameterの中で許容するフィールドを絞るメソッド」

と認識しています。
例を挙げて説明していきます。

普通のストロングパラメータ

blogsテーブルのカラムはcontentとimageの二つを考えます!

app/controllers/blogs_controller.rb
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 とします。

このときのストロングパラメータは、

app/controllers/blogs_controller.rb
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を付け加える事ができました。

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1