ほげほげパッチ

有る事無い事 徒然なるままに

params深掘り

paramsの使い所がわかりません

エラーの原因を探るときに、時々使われているけど、自分で使おうと思ってもさっぱり。

とりま、いつ何が入るのか追いかけてみる。

  1. createアクション内にbinding.pry
    10: def create
    11:   @post = Post.new(post_params)
    12: 
    13:   if @post.valid? #valid?
    14:     @post.save
    15: 
    16:     redirect_to root_path
    17: 
 => 18:     binding.pry
    19:   else
    20:     render 'new'
    21:   end
    22: end

 (コンソールでparamsと入力)

[1] pry(#<PostsController>)> params
=>   <ActionController::Parameters {
     "authenticity_token"=>"Ka2ubHwLc・・・Bp8g", 
     "post"=>#<ActionController::Parameters {"title"=>"d", "content"=>"d"} permitted: false>, 
     "commit"=>"投稿する", 
     "controller"=>"posts", 
     "action"=>"create"
     } permitted: false>


  • 続いてindex.html.erb内にbinding.pry
 => 1: <% binding.pry %> 
    2: <% @posts.each do |post| %>
    3:   <%= render partial: "post", locals: { post: post } %>
    4: <% end %>

 (同じくコンソールでparamsと入力)

[1] pry(#<#<Class:0x000000010ceb71e0>>)> params
=> <ActionController::Parameters {
  "controller"=>"posts", 
  "action"=>"index"
  } permitted: false>




解説

  • ActionController::Parameters
    • これは、paramsというメソッド(変数?)を定義しているファイルとのこと。

例えば、posts_controller.rbの冒頭は、

class PostsController < ApplicationController

続いて、applicationcontroller.rbの冒頭が、

class ApplicationController < ActionController::Base

=> どうやら、全てのコントローラーはActionControllerを継承していおり、そのActionControllerにparamsの定義的なものが入っている、という構図のよう。

  • "controller"=>"posts", "action"=>"create"

    • これらは「どのアクションを実行するか」という情報として保持されている。
      (どちらのアクションでも共通:それ故にいろいろなアクションが実行される

  • "authenticity_token"=>"Ka2ubHwLc・・・Bp8g"

    • authenticity=信憑性*1
    • 信憑性を担保するために、登録するデータと一緒にランダムな文字列を紐付け、一異性を確保しているとのこと。

  • "post"=>#<ActionController::Parameters {"title"=>"d", "content"=>"d"} permitted: false>,

    • postモデルに対する操作情報を保持
    • これによってテーブルにデータが保存される。


まとめ

paramsの挙動をまとめると以下の3つ。

  1. 動作 + 属性値 をハッシュ構造として持つ
  2. URLとして動き始めたときに値が更新
  3. アクションを実行し終わるまで値を保持

結果、値を変えながらMVCの中をぐるぐるぐるぐる。 実は、フレームワークという枠組みの中で根幹的な役割を果たしている(っぽい)。



*1:authentic: autos(自分自身)+hentes(行為者) -> 権威ある独裁者 => 本物の、信頼のおける、確かな
automatic: 自分(autos)で考えて(men-)動く物の(-ic) -> 自動の、無意識の
出典:語源英和辞典 – 英単語のコアの語源が理解できる辞書