Rails Tutorialで学べることメモ-第7章-
Rails Tutorial を改めてしっかりやり直してのメモ第 7 章編
https://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_yaml
とy model_instance.attributes
は同じ出力を得る
まとめ
フォームの作成方法、PostgreSQL を作成してのデプロイ、TLS など Web サービス向けの知識が多くなった。
一方、Rails 特有のヘルパーメソッドや Strong Parameters のような重要な仕組みも学べる章だった。