yosaku_ibs
@yosaku_ibs

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

ストロングパラメータ後のカラムの追加について

Q&A

Closed

解決したいこと

以下のソースコードを見て頂きたく思います。

ストロングパラメータ内では「:user_id」というカラムの追加を許可してないのにも関わらず、次の行でbook_params[:user_id] = session[:user_id]というコードが書かれています。
「:user_id」はストロングパラメータで許可していないカラムなのですが
後から「:user_id」というカラムを追加できるものなのでしょうか?

ソースコード


def create
 book_params = params.require(:book).permit(:year, :month, :inout,:category, :amount)
 book_params[:user_id] = session[:user_id] @book = 
 Book.new(book_params)
 if @book.save
    flash[:notice] = "家計簿にデータを1件登録しました"
    redirect_to books_path
 else
    flash.now[:alert] = "登録に失敗しました。"
    render :new
 end
end


自分で試したこと

思いついたキーワードで検索しましたが
解決に繋がるヒントが見つかりませんでした。。。

以上、誠にお手数ではございますが
もしご存知の方がいらっしゃいましたら
ご教示の程よろしくお願い申し上げます。

0

2Answer

気になったので調べてみました。

まず

params.require(:book).permit(:year, :month, :inout,:category, :amount)

ここの部分ですが、戻り値の型はActionController::Parametersです。

この型では[]=というメソッドが定義されているため、追加できるのではないでしょうか。
リンク先からソースコードに飛べるので、確かめてみるとよいと思います。

1Like

Comments

  1. @yosaku_ibs

    Questioner

    @yucatio様

    はじめまして。お世話になります。
    ご回答くださり誠にありがとうございます。
    「戻り値の型」についてお聞きしたいのですが
    「戻り値の型」といいますとintやdoubleやstringを思い出すのですが
    ActionController::Parametersという「戻り値の型」が存在するのでしょうか?

    初歩的な質問で大変恐縮でございますが
    ご教示頂けますでしょうか?

    以上、よろしくお願い申し上げます。
  2. `ActionController::Parameters` は正確に言うとクラスですね。

    permitメソッドの中で`ActionController::Parameters`のインスタンスを作成して、そのインスタンスが戻り値になっています。

    > 「戻り値の型」といいますとintやdoubleやstringを思い出すのですが
    > ActionController::Parametersという「戻り値の型」が存在するのでしょうか?

    intやstring以外にも、クラスのインスタンスなどが戻り値になります。
    クラス`ActionController::Parameters`のインスタンス`book_params`が戻り値の時、「`book_params`の型は`ActionController::Parameters`である」と言うことがあります。
  3. @yosaku_ibs

    Questioner

    @yucatio

    いつも大変お世話になっております。
    >intやstring以外にも、クラスのインスタンスなどが戻り値になります。
    謎が完全に解けました!
    だから「ActionController::Parameters」に定義されている「[]=」というメソッドを使って「:user_id」を追加できたわけですね!

    すっきりしました。
    本当にありがとうございます。

    わかりやすく解説くださり誠にありがとうございました!

    以上、御礼申し上げます。

@yosaku_ibs

はじめに

追加質問の件で失礼します。

なるべく分かりやすく・簡潔に、を心掛けているのですが
正確性に欠けると申し訳ないので、
以下、長文になることを先にお詫びします。

追加質問について

「戻り値の型」といいますとintやdoubleやstringを思い出すのですが

恐らく、他言語で言うところの「プリミティブ型」を思い浮かべた、という質問でしょうか。

Rubyの場合は
「動的型付けであり変数に型がない」ため

params.require(:book).permit(:year, :month, :inout, :category, :amount)

の結果として帰ってきた値の型で
book_params
という名称の変数に格納されるという回答になります。

参考リンク:Ruby 3.1 リファレンスマニュアル(はじめに - 変数に型が無い)

補足

ActionController::Parameters
についてはおおよそ、Rubyの「クラスなどに関する」記法
だと解釈していただいて大丈夫かと思われます。
(C++にもこの記法がありますが今回は除きます。)

色々な意味合いがありますが、
今回のように「クラス・モジュール」に関する場合はざっくり「入れ子」の表現になります。
厳密な意味は後述の参考書籍に記述されている内容が一番正確かと思われます。

Javaで言うところの、
class Parameters extends ActionController
に近いとイメージしてもらえれば分かりやすいでしょうか。
(正確にはJavaの継承とは違うのであくまで例えです。)

なお、Ruby及び、Railsのバージョンにより
定義や挙動などが異なるためご自身の開発環境に合った
公式ドキュメントをご参照ください。

役立ちそうな参考書籍やサイト

もし、Rubyについての基礎知識
(Rubyの文法や構造、など)を固めたい場合は
以下の書籍をお勧めします。(販売形態が様々なのでこちらは引用形式にします。)

プロを目指す人のためのRuby入門 (正式名称略) (著:伊藤 淳一)

また、Railsについての基礎知識
(アプリ作成を通して基本概念を知る、など)を固めたい場合は
以下のサイトをお勧めします。
参考リンク:Ruby on Rails チュートリアル

上記、「役立ちそうな参考書籍やサイト」についても、公式ドキュメント同様
Ruby及び、Railsのバージョンにより
内容が異なるのでご注意ください。

少しでもお役に立てれば幸いです。

1Like

Comments

  1. @yosaku_ibs

    Questioner

    @syutorum001

    いつも大変お世話になっております。

    >恐らく、他言語で言うところの「プリミティブ型」を思い浮かべた、という質問でしょうか。
    Rubyの場合は「動的型付けであり変数に型がない」ため~

    ずばりそうです笑
    私自身も「Rubyは動的型付言語なので変数の型がない」という認識でした。

    ご紹介くださった書籍の中身を見ましたが、なかなか良さそうな内容でした。
    (「哲学」も交えて説明されている書籍は個人的に大好きです。※私個人として「哲学」とは人間の思考に関するフレームワークだと思っています。)
    なので購入してじっくり見てみます。

    細かくご説明くださりありがとうございました。

    以上、御礼申し上げます。

Your answer might help someone💌