Help us understand the problem. What is going on with this article?

StrongParameters のはまりどころ

More than 5 years have passed since last update.

StrongParametersActionArgs を同時に使うと、以下の様な感じのシンタックスでパラメータを制御できる。

articles_controller.rb
class ArticlesController < ApplicationController
  # ココ注目
  permits :title, :body

  def new
    @article = Article.new
  end

  def create(article)
    @article = Article.new article

    if @article.save
      redirect_to @article, notice: "New article was successfully created."
    else
      render 'new'
    end
  end
end

で、ソーシャルメディアに同時に拡散する感じのコードを書いている時にハマった。

aticles_controller.rb
class ArticlesController < ApplicationController
  # ココ注目
  permits :title, :body, :social_media
...

これだと、social_mediaに何も入らなかった。何度やっても無駄だった。謎い。
それもそのはず、viewでは↓こうなっていたから。

new.html.haml
= form_for @articles do |f|
  .field
    = f.label :social_media_facebook do
      = f.check_box :social_media, { multiple: true }, 'facebook', nil
  .field
    = f.label :social_media_twitter do
      = f.check_box :social_media, { multiple: true }, 'twitter', nil

つまり、permitsしたsocial_mediaには複数の値が入る可能性がある、っていうのをStrongParametersにあらかじめお知らせしておかなくてはいけない。
というわけで、↓こう書き換えた。

articles_controller.rb
  # ココ注目
  permits :title, :body, social_media: []
...

万事解決。

tbaba
プログラマー。ウェブアプリケーションとか。元 https://forkwell.com の中の人。今はちょっと違う仕事。仕事道具はVimとGit。Gitは綺麗な歴史を作る派。
http://weblog.tbaba.jp
grooves
エンジニア向けサービス「Forkwell」や「Forkwell Jobs」を開発・運営しています。
https://forkwell.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away