2020/12/13 railsチュートリアル7章
開発環境のみデバッグ情報を表示する
<%= debug(params) if Rails.env.development? %>
paramsとは
railsが常に保有しているパラメータ情報、どこのURLにアクセスしているかなど
上のデバッグ情報を見ると、paramsのなかにいろんなデータがあることがわかる
後でURLからIDを引っ張ってくるときに使う
これはルーティングのURLに[:id]って入ってるから出てくるのか?
RESTfullなルーティング
user GET /users/:id(.:format) users#show
user GET →名前付きルート
/users/:id(.:format) →URL(かっこの中は他のフォーマットにも対応できるという意味らしい)
users#show →呼び出されるアクション
progateと違いすぎてめっちゃ戸惑う
progateで
get "/users/:id" => "users#show"
とか書いてたところは、7つのアクションひっくるめて
resources :users
で終わるらしい。
変数
コントローラーのアクション内での
user = User.first
と
@user = User.first
の違い。
userがローカル変数、@userがインスタンス変数。(ちなみに@@userはグローバル変数)
ローカル変数は、アクション内だけ。
インスタンス変数はもうちょと広く、showアクションの外側、viewの中でも使える。
debugger
アクションの中にコードを埋め込む
def show @user = User.find(params[:id]) debugger end
すると、debuggerのある時点での@userとかparamsの状態をコンソール(rails serverを立ち上げているやつ)から確認できる
byebug gemで利用できる機能
gravator
gravotorというサービスに登録しているとその画像を引用できるらしい。
users_helperにヘルパーメソッドを定義する
moduleはメソッドをいろんなとこで使えるようにメソッドを定義する場所
user_helperに定義したメソッドはusers_controllerで使える
form_with
form_for --モデルを引数にする
form_tag --モデル以外を引数にする
form_for --form_forとform_tagが合体
<%= form_with(model: @user, local: true) do |f| %> <%= f.label :name %> <%= f.text_field :name %> <%= f.label :email %> <%= f.email_field :email %> <%= f.label :password %> <%= f.password_field :password %> <%= f.label :password_confirmation, "Confirmation" %> <%= f.password_field :password_confirmation %> <%= f.submit "Create my account", class: "btn btn-primary" %> <% end %>
わからない
<%= form_with(model: @user, local: true) do |f| %>
model: @user
どのモデルを対象にするか
@userにuserモデルのインスタンスを格納している時
<form action="/users" accept-charset="UTF-8" data-remote="true" method="post">
というhtmlタグが生成される
このほか、URLを直接指定するやり方もある(form_tag的な使い方?)
<%= f.label :name, '名前' %> <%= f.text_field :name %>
このタグからは、
<label for="user_name">名前</label> <input type="text" name="user[name]" id="user_name" />
このhtmlタグが生成される
form_withをsubmitしたら指定したURLにPOSTリクエストを送る
name="user[name]" は、paramsのどこに入りますよ、という部分
createアクション実行時点でdebuggerでparams見ると、フォームに入れたやつがハッシュに入ってる!なるほろ
params[:user]にあるデータの構造は、Usersモデルの構造と一緒なので、User.new(params[:user])でいい感じになる・・・とのこと(Railsがそうしてくれる)
ActiveModel::ForbiddenAttributesError
paramsの中身は誰が入力するか
もしかしたら管理者権限を奪われたりするかもしれない。。
そこで、paramsの中身をちゃんとチェックしよう!
(マスアサインメントという脆弱性)
Strong Parameter
params.require(:user).permit(:name, :email, :password, :password_confirmation)
このように限定した属性のみparamsへの入力を許可することで、脆弱性に対策する
慣習として別にメソッドを作る
privateメソッド
private以下のメソッドはこのファイルの中でしかアクセスしないことを前提に作っているメソッドですよ、ということ