チワワかわいいブログ

RUNTEQでrails勉強する日々の記録

2020/12/13 railsチュートリアル7章

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以下のメソッドはこのファイルの中でしかアクセスしないことを前提に作っているメソッドですよ、ということ