tnkzw.sake

HomeSeriesTagsAbout

Rails Tutorialで学べることメモ-第7章-

Series
Railsチュートリアル

Rails Tutorial を改めてしっかりやり直してのメモ第 7 章編

https://railstutorial.jp/chapters/sign_up?version=7.0https://railstutorial.jp/chapters/sign_up?version=7.0

コマンド

bundle config set --local without 'production'

Gemfile でgroup :productionの gem を、ローカルでは instal しない設定を付与する。
--local without 'production'は一度実行すると記憶され、以降のbundle installでは暗黙的に設定が受け継がれるらしい。

便利なメソッド

any? empty?

あるのか、ないのか?
直感的で分かりやすい。

pluralize

英単語用のメソッドで、活用形をいい感じに表示してくれる。
console ではhelperオブジェクトを通じてアクセスできるらしい。

helper.pluralize(1, 'error') # 1 error
helper.pluralize(5, 'error') # 5 errors

redirect_to

個人的に Rails で一番分かりにくいのが、パス関連。
例えば、user 登録で保存が成功した際にredirect_to @userと書くとredirect_to user_url(@user)と同等で扱ってくれるらしい。

Rails の書き方は、本当に規約的に色々と作られるので「言語学習」感が強い。
チームで使うときは各人の Rails 習熟度を一定以上に合わせるような仕組みを作らないと読めないじゃん!と言われても仕方がない。

follow_redirect!

post リクエストを送信した結果を見て、指定されたリダイレクト先に移動するメソッド。
もうなんでもある。

content_tag

HTML 要素を生成する Rails のビューヘルパー。
HTML と ERB が混ざるようなコードがある際に便利...と文字で書いてもイメージが突きにくいので例のコードを。

content_tag(:div, "content", class: "alert-#{type}")
#=> <div class="alert-success">content</div>
# <div class="alert-<%= type %>">content</div> のように書かなくて良い

知識

Rails の環境と使い方

Rails にはRailsオブジェクトがあり、Rails.envで現在の環境を呼び出すことができる。

環境ごとにRails.env.test?のようなメソッドがあり、環境独自の処理を書く際によく利用する。

console や server 立ち上げの際には適当な環境がデフォルトで設定されるが、例えば console をテスト環境で実行する必要が出た場合は次のコマンドで console を立ち上げる。

bin/rails c --environment test

フォーム

Rails ではform_withヘルパーメソッドを用いて、ActiveRecord のオブジェクト属性からフォームを作成できる。

具体的には controller で@user = User.newとしたとして、次のように書ける。

<%= form_with(model: @user) do |f| %>
  <%= f.label :name %>
  <%= f.text_field :name %>
<% end %>

出力はnewに対応するので、action="/users", method="post"の form タグに囲まれて params に値が入るようなnameを持った input とラベルが生成される。

<form action="/users" accept-charset="UTF-8" method="post">
  <input
    type="hidden"
    name="authenticity_token"
    value="long and random value"
    autocomplete="off"
  />
  <label for="user_name">Name</label>
  <input type="text" name="user[name]" id="user_name" />
</form>

このフォームがサブミットされた時、Rails の受け取る params 内にuserキーが存在し、input のname="user[name]"に対応する値が入っている。

Strong Parameters

前述のように post された params の値をそのまま使ってUser.new(params[:user])とすると、悪意あるユーザーからparams[:user]内に予期せぬ値をリクエストされた際に、簡単に不都合が起こる。

例えば user に admin 属性があり、フォームには admin 設定は設置していないが、別の手段でadmin: trueを乗せたpost /usersが実行されると管理者権限を持ったユーザーを作成されてしまう恐れがある。

このようにハッシュをそのままモデル属性に渡すマスアサインメントは便利な反面、使い方を間違えると危険性がある。

そこで Rails が用意する Strong Parameters では、params の中から利用するものを許可するホワイトリスト形式でパラメータを制御できる。

params.require(:user).permit(:name, :email, :password, :password_confirmation)

こう書くと、:userがない場合はエラーとなり、:user内のキーはpermitメソッドで列挙されたもののみが採用される。

flash

新規登録時などにメッセージを出し、2度目以降はそういったメッセージは表示しないような挙動を実現するために利用する Rails の特別なオブジェクト。

controller の save 成功後の処理で

flash[:success] = "Welcome!"

のように書くだけで良い。

TLS を利用する

Transport Layer Security(TLS)はローカルからネットワーク上にデータ送信する際に暗号化を行う技術。

Rails ではconfig/environments/production.rb内に 1 行記述を追加するだけで、あらゆるブラウザで TLS を強制できる。

config.force_ssl = true

ただし、自分の専用ドメインで TLS を利用する場合は、TLS/SSL 証明書を購入して設定する必要がある。

細かな知識

  • puts model_instance.attributes.to_yamly model_instance.attributesは同じ出力を得る

まとめ

フォームの作成方法、PostgreSQL を作成してのデプロイ、TLS など Web サービス向けの知識が多くなった。

一方、Rails 特有のヘルパーメソッドや Strong Parameters のような重要な仕組みも学べる章だった。