params深掘り
paramsの使い所がわかりません
エラーの原因を探るときに、時々使われているけど、自分で使おうと思ってもさっぱり。
とりま、いつ何が入るのか追いかけてみる。
- 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というメソッド(変数?)を定義しているファイルとのこと。
- これは、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つ。
- 動作 + 属性値 をハッシュ構造として持つ
- URLとして動き始めたときに値が更新
- アクションを実行し終わるまで値を保持
結果、値を変えながらMVCの中をぐるぐるぐるぐる。
実は、フレームワークという枠組みの中で根幹的な役割を果たしている(っぽい)。
*1:authentic: autos(自分自身)+hentes(行為者) -> 権威ある独裁者 => 本物の、信頼のおける、確かな
automatic: 自分(autos)で考えて(men-)動く物の(-ic) -> 自動の、無意識の
出典:語源英和辞典 – 英単語のコアの語源が理解できる辞書