TECH EXPERT8日目

TECH::EXPERT

昨日で最初の1週間が終わり、今日が中間テストの日。
といっても勝手に始めて自分で採点するのだが。
中間テストは0点でもOKだが、来週の本試験では合格しないといけない。
スケジュールに先行している人は既に本試験も終わらせているが、私はonTime。
1日分のアドバンテージがあったはずなのになぁ。

で、テストはどうだったかと言うと24/100点。1
問目のrubyの問題は満点で、2問目のHTMLで終了。
点を取るのが目的ではないので、満足行くまでHTML調べていたら知らない間にTimeUpしてた。
なので2問目以降は解いてないので0点で終了。

チラ見した感じではエラー問題なので、多分やらなくても大丈夫。
根拠レスだがRubyやRailsに関しての問題なら今の理解度で十分。
ただ、HTMLに関しては苦手。HTMLの仕様が直感的でないのが原因だ。
inline-blockにすると謎のスペースが入ったり、Floatした時の挙動だったり。
line-heightを設定しないと垂直方向の中央揃えにならなかったり。上げればキリがない。
しかもline-heightをboxサイズより大きくしてもはみ出してそのまま通用してしまう。
ブロック内の要素がブロックを超えられない仕様にすればいいのに。
なんというか未成熟な言語だなぁ。
この言語を使うのをやめれば生産性あがるんじゃなかろうか?

やったことメモ

authenticate_user!

deviseをインストールすると、ログイン画面とサインアップ画面を自動で用意してくれます。authenticate_user!はdeviseをインストールすることで使えるメソッドです。ユーザーがログインしているかどうかを確認し、ログインしていない場合はログインページにリダイレクトします。通常、before_actionを合わせて使用します。before_actionのexceptやonlyオプションを組み合わせると特定のアクションを指定することもできます。

before_action :authenticate_user!, only: :new

Active Storage

画像アップロード用のgemであるActive Storageを使う。

ImageMagick

ImageMagickという画像変換ツールと、それをRailsから使うためのmini_magickというgem

brew install imagemagick

gemfile

gem 'mini_magick'
bundle install

インストールが終わったらサーバーの再起動

Active Storageのインストール

rails active_storage:install
rails db:migrate

Userモデルに設定を追加

user.rb

class User < ApplicationRecord
  #Include default devise modules. Others available are:
  #:confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  has_one_attached :avatar
end

Gemを探す.

 list または search は、ローカルもしくはリモートにあるGemパッケージを検索します。

gem list

form_for

<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
<%= devise_error_messages! %>

<div class="label"><%= f.label :email %><br />
<%= f.email_field :email, autofocus: true, :placeholder => 'メールアドレスを入力' %></div>

<div class="label"><%= f.label :password %> <% if @validatable %><i>(<%= @minimum_password_length %> characters minimum)</i><% end %><br />
<%= f.password_field :password, autocomplete: "off", :placeholder => 'パスワードを入力' %></div>

<div class="label"><%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation, autocomplete: "off", :placeholder => 'パスワードを入力(確認)' %></div>

<div class="label"><%= f.label :nickname %><br />
<%= f.text_field :nickname %></div>

<div class="label">
<%= f.file_field :avatar %>
</div>

<div class="submit">
<div class="actions">
<%= f.submit %>
</div></div>

<div class="more_link_box">
<strong>すでにアカウントを持っていますか?</strong>
<%= render "devise/shared/links" %>
</div>
<% end %>

devise_parameter_sanitizer

devise_parameter_sanitizerメソッドを使うとdeviseで設定されているstrong_parametersに対してパラメーターを追加できる。
devise_parameter_sanitizerメソッドはbefore_actionに設定する。
これはdeviseの処理なので、Deviseのコントローラを継承したコントローラかもしくはApplicationControllerに記述する。この際に直接before action内にdevise_parameter_sanitizerを書いてはいけない(なぜ?)

devise_parameter_sanitizer.permit(追加したいメソッドの種類, keys: [追加したいパラメーター名])

指定する引数は2つ。1つ目が「StrongParametersを追加したい処理の種類」

引数の値処理
:sign_up新規登録時
:sign_inログイン時
:account_updateレコードの更新時

2つ目の引数には追加したいパラメーター名を渡す。
複数の場合は,(カンマ)区切りで渡す。

devise_parameter_sanitizer.permit(追加したいメソッドの種類, keys: [:パラメーター1, :パラメーター2,..])
class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception
  before_action :configure_permitted_parameters if: :devise_controller?

  def after_sign_out_path_for(resource)
    '/users/sign_in' # サインアウト後のリダイレクト先URL
  end

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up,keys: [:avatar, :nickname]) 
  end
end

devise_parameter_sanitizerメソッドはdeviseで追加されたメソッドなので、Deviseのコントローラ以外で呼び出せない。よって、before_actionを適応するコントローラを指定します。

before_action :メソッド名, if: :コントローラ名?

テーブルからカラムを削除

#reviewsテーブルからnicknameカラムを削除するためのマイグレーションファイルを作成
rails g migration RemoveNickNameFromReviews nickname:string
#マイグレーションファイルの実行
bundle exec rake db:migrate

Resources

自動でルーティングしてくれる。
7種類。only等で使うものだけ指定する。
new, create, show, destroy, index, update/put, update/patch

user_signed_in?

ハッシュに値を追加

hash[:key] = 値
もしくは
ハッシュオブジェクト.store(key,value)

オブジェクト.each{|key, value|

プロジェクトの作成にミスった場合

rails new project名 -d mysql で間違った場合。
(projectsフォルダでやらずにprojectフォルダを自分で作って移動してからやった)
=> フォルダ以下を削除でOK

rake db:createでデータベースまで作っちゃった場合、
prokectsではなく、projectの階層で以下を実行。

rake db:drop

2 Controller Naming Convention

The naming convention of controllers in Rails favors pluralization of the last word in the controller’s name, although it is not strictly required (e.g. ApplicationController). For example, ClientsController is preferable to ClientControllerSiteAdminsController is preferable to SiteAdminController or SitesAdminsController, and so on.

Following this convention will allow you to use the default route generators (e.g. resources, etc) without needing to qualify each :path or :controller, and will keep URL and path helpers’ usage consistent throughout your application. See Layouts & Rendering Guide for more details.

self. クラスメソッド

クラスからしか呼べない。クラスオブジェクトからはインスタンスメソッドを呼べないので、逆説的にクラスメソッドを使うときはdef self.classmethod endと定義しないと使えない。

コメント