テックエキスパート7日目です。本日は中間試験を受けました。カリキュラム上は7/20に受けることになっていたので少しだけ前倒しという感じですね、、。
結果は30点くらいでしたw 平均は10点くらいらしいですが、本当かどうかも分かりませんし、とりあえず全然ダメなのでしっかり復習して本試験に備えたいなと思います。
備忘録いきます
いったん基礎カリキュラムの最後までいったので、あとは復習に入っていく中で理解の足りない部分を重点的に再度アウトプットしたいなと思います。
すべてのコントローラーで共通のアクションを入れたい場合はApplication Controllerに
すべてのVIEWに入れたい場合はapplication htmlでしたが、アクションを入れたい場合はapplicationコントローラーに記述します。
これはすべてのコントローラーがアプリケーションコントローラーを継承しているからです。
ビューの指定
基本的にアプリケーションコントローラーが最初に表示するのはアプリケーションHTMLだが、コントローラー内でlayout ‘レイアウトファイル名’と記載するとコントローラーが最初に表示する
each.with_indexメソッドで番号表示
eachメソイッドを使って繰り返し表示をする際、with_indexメソッドを併用することで番号をつけることができます。
またこの時、基本的には0から始まりますが引数を渡せばその番号から始まります。
expert = ["a", "b", "c"]
expert.each.with_index(1) do |element, index|
puts "#{index}:#{element}"
end
#=>(実行結果)
1:a
2:b
3:c
groupメソッド
groupメソッドはテーブルのレコードを指定したカラムでまとめることができるメソッド。
使い方は「モデル.group(:カラム名)」例えば Tweet.group(:user_id)とする場合は、ツイートテーブルのuser_idカラムの数値が同じものをまとめる処理になります。
id | text | user_id |
1 | aaaa | 1 |
2 | bbb | 2 |
3 | ccc | 2 |
4 | ddd | 1 |
Tweet.group(:user_id)
=> Tweet[<id:1, text:aaaa, user_id:1>,<id:4, text:ddd, user_id:1>,<id:2, text:bbb, user_id:2>,<id:3, text:ccc, user_id:2> ]
みたいな感じでまとめられる。しかしこの時、各グループの1個目の数値(idが一番小さいもの)しか表示されないので注意。何個あるかもわからない。
countメソッドでカウントできる
そんな、配列に何個入っているか分からない場合はcountメソッドを使って各カラムが何個あるのか確認することができます。
Tweet.group(:user_id).count
=>{1=>2, 2=>2}
といった感じでハッシュが返ってきます。この2というのがカウントした数値ですね。
カウントしたものをソートする方法
ここまででまとめたものをカウントするところまでできましたが、本来であればカウントしたらソートまでしたいところかと思います。
そこでソートする方法というのがorder(‘count_カラム名’).count(カラム名)で可能です。簡単に言うとcoount_カラム名をオーダーメソッドに適用することでソートが可能ということです。
Tweet.group(:user_id).order('count_user_id DESC).limit(5).count(:user_id)
=> {1=>2,2=>2}
リミットは数を制限したい場合に使うあれですね。この時ハッシュの形で出力されます。
keysメソッド
keysメソッドはその名の通り、ハッシュのキーの値のみとってくるメソッドです。上の例で言えば、左側の1と2がそれぞれキーになっていますので、keysメソッドを使うことで取り出すことが可能です。
使い方は簡単で最後に「.keys」をつけるだけでOKです。
whereメソッドは配列でも取得可能
テーブルから特定のものを探す際にwhereメソッドというものがありますが、whereメソッドは配列でも取得可能です。例えば以下のようなテーブルの場合
id | text | user_id |
1 | aaaa | 1 |
2 | bbb | 2 |
3 | ccc | 2 |
4 | ddd | 1 |
テーブルのidの配列をidsを使ってwhereすると以下のようになります。
ids=[1,2,3]
tweet=Tweet.where(id: ids)
=>[#<Tweet id:1,text:aaa,user_id:1>,<Tweet id:2,text:bbb・・・]
みたいな感じで取り出すことができます。
配列に繰り返し処理をできるメソッド mapメソッド
mapメソッドは配列に対して繰り返し処理を行うことのできるメソッドです。
例えば以下のような感じで使います。
examples=["a","b","c"]
ex=examples.map{|example| example +"2" }
puts ex
=>["a2","b2", "c2"]
after_sign_out_path_forメソッド
deviseでサインアウトしたあとのリダイレクト先を指定するメソッドとしてafter_sign_out_path_forがあります。このメソッドでは返り値にサインアウト後のリダイレクト先URLを指定します。
参考記事:https://qiita.com/GREAT__SHARK/items/6280ab19c4c8c7dc6506
authenticate_user!
同じようにdeviseをインストールするとこのメソッドも使用可能です。このメソッドではユーザーがログインしているかどうかを確認し、ログインしていない場合はログインページにリダイレクトさせることが可能です。
基本的にbefore_actionを合わせて使用し、onlyやexceptで制限をかける。
devise_parameter_sanitizer
こちらもdeviseのメソッドで、ストロングパラーメーターに対してパラメーターを追加できるメソッドですね。
deviseではログイン機能がありますが、ストロングパラメーターでメアドとpass以外受け付けないようになっています。これに何か追加したい場合にこいつを使います。
devise_parameter_sanitizer.permit(追加したいメソッドの種類, keys: [追加したいパラメーター名])
↓
devise_parameter_sanitizer.permit(:sign_up, keys: [name])
これでサインアップの時に、nameをキーとした
レコードを追加できる。
ちなみに記述するのはdeviseのコントローラーを継承したコントローラーかアプケーションコントローラーにbefoe_actionとして設定するので注意。
befor_actionにそのまま設定してはダメ。
before_action :configure_permitted_parameters
def configure_permitted_parameters
# devise_parameter_sanitizerメソッドを呼び出す
end
deviseのコントローラー以外では使えないので、コントローラーで制限かける
before_action :メソッド名, if: :コントローラ名?
ImageMagick
ImageMagickは、コマンドラインから簡単に画像の保存形式の変更などが行えるツールです。こちらの記事に詳しく掲載されています。
しかし脆弱性についての指摘もあるので要注意です。
validation
validationは入力フォームを通じてビューからサーバー側に送られてきたパラメータが適切かどうか検証する機能。
validates :カラム名, presence: true
これによって例えばフォームが空欄かどうかを確認し、空欄であれば処理を実行しないといったことができる。
class Tweet < ApplicationRecord
validates :text, presence: true
※validatesメソッドは、Railsアプリケーションフォルダのapp/models/◯◯.rbにソースコードを記述。
placeholder: ”
フォームの中に、placeholder:’ ‘で囲んだ文字を記載することで、フォームの値が空の時に薄く表示しておくことができます。
<%= f.text_field :name, placeholder: '名前を入力(必須)' %>
find_byメソッド
特定の条件を満たすインスタンスを取得する際に使う。ただし複数条件に当てはまる場合はidが最も若い者を選んでくるので注意。
モデル名.find_by(カラム名: 値)で検索してヒットした最初のレコード1つのみを取得します。
where →全部取得したい場合はwhereで
whereメソッドであれば全部取得できます。また配列のような形で出力されるのでeachメソッドなども利用可能。
忘れがちなこと
メソッド内の変数は他のメソッドでも使っていいが、メソッド外で定義した変数は引数に入れないと使えない。
メソッドの最後にリターンは書かなくても良い。基本的にメソッドの最後の処理がそのメソッドの解となるので。あえて別の答えを返したい場合にreturnを使う。
CSS Z-index
Z-indexはCSSで要素が重なっている場合に、どれを手間に・どれを後ろにするか決めることのできるプロパティのこと。
z-index: 値(整数;
値が大きいものほど手前に表示される。
z-indexを使用するには、その要素にpositionプロパティでstatic(初期値)以外の値が適用されている必要があるので注意!
CSS list-style: none;
<li>タグがついている場合、何も設定しなければ「・」がついてくるためlist-styleでnoneにしておく必要がある。
CSS position relative, absolute
CSSで親要素を元に子要素の位置を決めたい場合は、親要素にposition:ralative;を設定し、子要素にposition:abusolute;top:;right:;bottom:;left:;を設定する。
absoluteで真ん中に設置する方法
absoluteで親要素の真ん中に配置するためには、以下のようにする。
.ko-youso{
position:absolute;
top:0;
right:0;
bottom:0;
left:0;
margin:auto;
}
これはテキストなどをセンターにするときも同じ。textなどでmargin 0 autoにすると中央揃えになる。(text_align:center;と同じ)
CSS ポジションフィックスのイメージ
イメージはふわふわと浮いているイメージ。なのでそこに被らないようにしたい場合は、marginではなくpaddingで位置を調節する。