さてテックエキスパートも4日目になりました。このブログは受講している時間内に書いているのですが、少々時間がなくなってきました。
諸々整理している情報も何日か前の情報だったりするので、カリキュラムのスピードに追いついていない感じです・・
とはいえアウトプットするのは非常に重要なので続けていきますがなかなか大変ですね。今回は完全に自分の備忘録です。
Rails を呼び出すことができるコマンド
Ruby oin rails で実際に作成したアプリケーションの内容や機能を呼び出すにはターミナルで「rails c」と打つことによって指示が出せる状態になります。
なおrails cコマンドを解除するにはexitを入力する。
ちなみにターミナルのプロセスの終了には「コントロール C」を使う。
RailsでDBとの連携が簡単にできるのはAcctive Recordのおかげ
Rails ではnewメソッドやcreateメソッドなどを使って簡単にデータベースに情報を作ったり保存したり見つけたり(find)することができますが、これらは全てAcctive Recordのおかげです。
通常DB(MySQLなど)とのやりとりにはSQLを使う必要がありますが、Rails ではAcctiveRecordが適用されているため、直感的な簡易な文章でDBとの連携を行うことができています。
厳密にはModelにApplicationRecordが継承されることによってActiveRecordが適用されている。
参考記事;https://qiita.com/Ryokky/items/a1d0b4e86bacbd7ef6e8
railsでテーブルのプロパティ値を取り出す方法
railsではテーブルのプロパティ値(テーブルの1つ1つの値ですね)を結構簡単に取り出すことができます。
STEP1→変数でインスタンスを指定
@user=User.new(name:"田中")
STEP2→「変数.カラム名」で取り出すことができます。
puts @user.name
Rubyではattr_accessorがないとダメだったのに、railsでは何もしなくても取り出せている?
この方法ですが、Rubyではゲッターセッターをセットして初めて有効になるものでしたが、Railsでは何の操作もなしに実装できています。
じゃあなんでRailsでそれが可能かというと、先ほどもあったAccticveRecordでそれもできるようにメソッドが組み込まれているからだそうです。
参考記事:https://qiita.com/yamayu_504/items/ad6ebe21226686391c47
ヘルパーメソッド
Railsではviewをより綺麗に、より簡潔に記載するためのメソッドが予め用意されています。それがヘルパーメソッドです。
simple_format
シンプルフォーマットを使えば改行をビューに入力しておけば、HTMLとして吐き出す際に<br />を自動的にいれてくれます。※文字列には自動的に<p>が入る点には注意。
<% text="あああ\nあああ" %>
<%= simple_format(text) %>
→<P>あああ
<br /> あああ</p>
form_tag
入力フォームに必要なHTMLを簡潔に作成可能。このフォームタグではリソース(参照先)とHTTPメソッド(postとか)を指定する必要がありますが必要なのはそれだけです。
書き方はいくつかあるようです。
<%= form_tag('/index', method: :post) do %>
ここは自由 htmlなど記述
<% end %>
もう1つの書き方
<%= form_tag(index_path, method: :post) do %>
<% end %>
他にも書き方はあるようですが、ちょっとややこしそうなので一旦二つくらい認識していればいいかなと思っています。
※doを忘れがちなので注意
formtagにいれられた数値はparamsで受け取ることができる
form_tagなどを使って情報を送ることはできますが、それをコントローラーで受け取ってデータベースに保存する必要があります。
その時に活躍するのがparamsというメソッドです。paramsは送られてきた値を受け取るためのメソッドです。
送られてくる情報は今回のフォームタグのようなHTTPメソッドpostで送られてくる情報とHTTPメソッドgetで送られてくる情報との2種があります。
getメソッドで送られてくる情報というのは[:id]などの情報になりますがここではまず、postメソッドで送られてくる情報の受け取り方を解説したいと思います。
送信側
<input type="text" name="contents">
この場合、typeのテキストはテキストボックスのことなので一旦無視で、nameに注目します。paramsはこのname属性の中身を受け取ります。
受け取り方は以下のようにparams自体がハッシュになっているイメージです。
params={}
ここにname属性をキーとして値を受け取ります。
params={contents:○○⇦入力された内容}
なのでこの情報を取り出すには
params[:contents]とすることで送られた情報を受け取ることができます。実際にはコントローラーに送られた後何らかのアクションに回すはずなので
@tweet = params[:contents]のような感じで使われるのではないかと思います。
require_tree
require treeには因数として入れたディレクトリ以下の全てのCSSファイルをアルファベット順に読み込むという意味を持つ。
例えばrequire tree.にした場合、「.」はカレントディレクトリを意味するのでカレントディレクトリ以下全CSSを読み込むという意味になる。
fontファイルについて
fontファイルはapp/assets/fonts以下のディレクトリに設置する。またその際、CSSに記述をしなければ適用はされない。
createメソッド
テーブルにレコードを保存する際にはcreateメソッドを使う。このメソッドはnewメソッドとsaveメソッドの両方の役割を持つ。
User.create(name: "田代", email: "tashiro@tashiro.co.jp")
何かデータを送る際にはルーティングの設定が必要
例えばform_tagで情報を送る際には「どこに」「何をする」のか付与してあげる必要があります。
まず「どこに」というのがパスと呼ばれるまあurlみたいなものですね。送り先のパスを指定してあげる。
「何をする」を担うのがHTTPメソッドです。HTTPメソッドは7~8個ありますが、データの追加を依頼するのがpostメソッドになります。
なので基本的にform_tagが出てきた時はmethod: :postでOKかと思います。
ストロングパラメーター
ストロングパラメーターとは許可されたキーを持つパラメータ(値)のみを受け取るようにするものです。
というのも先ほどのような入力フォームで悪意のあるユーザーが不正な情報を送ってくる可能性もなきにしもあらずです。
そういったことを防ぐためにはストロングパラメータが必要なのです。
設定方法
対象のコントローラー内に「パラメータ名_params」というメソッドを作成。メソッド内にはparams.permitと記載しその後ろに許可するパラメータのキーを記述する。
def aaaa_params
params.permit(:name, :email, :password)
end
で、実際にはこれをcreateアクションなどの引数とすることで、安全に新しい情報を生成する。ちなみにこの時ハッシュの形で取得されているので、下記のように取得することが可能。 params.permit{name: ○○, email: ○○}
def create
User.create(name: aaaa_params[:name], email: aaaa_params[:email])
end
privateメソッド
プライベートメソッドは (コントローラーの)クラス内で以下のように記載します。
private
def メソッド名
end
まあ特に何の工夫もありませんが、このように記述した場合、private以下のメソッドをclassの外部から読み込めないようにすることができます。
これをするメリットはclassの外部から呼ばれると困るものを守れるというのもありますが、大きいのは可読性のようです。
class外部から呼び出されるメソッドを探す際にprivate以下は読む必要がなくなります。ちなみに先ほどのストロングパラメーターも基本的にprivate以下に記載します。
これもクラス内部で処理が終わるもので、外部から呼び出される可能性がないので、最初から隔離しておこうという意図のようです。
image_tag
rasilsで画像を表示する際にはimage_tagを用いる。HTMLの書き方とは大きく異なるので注意が必要。
HTMLの場合
<img src="url" alt="">
Railsの場合
<%= image_tag '画像ファイル名' %>
サイズを指定する場合
<%= image_tag '画像ファイル名', => :size '100x1000' %>
null: trueについて
マイグレーションファイル作成の際に「null=true」にしておくと、通常nullだとエラーになるのを回避できる。(あまり実用性はない)
テーブルから情報を取得する時のお話
テーブルから何か情報を取ってくる際、テーブルの大元になってるのはモデル名なのでモデル名にしないとエラーになる。
tweet = Tweet'(モデル名).params[:id]
pry-rails
pry-railsというのはRails向けに作られたデバッグツール。作業の途中で処理を止めてそこまでの処理があってるかなどを見ることができる。
pry-railsの中でもっとも利用頻度が高いのがbinding.pry。
ソースの中でbinding.pryを記述することで、そこまででいったんRailsの処理を止めることができる。
使い方はいたって簡単で、ソースコードにそのままbinding.pryと記載するだけ。終わったらまた削除すればOK。
rake routes
ターミナルで$ rake routesと打つことで、routes.rbで定義したルーティングをターミナルで確認することができる。
特にエラーを改善する際などに有効活用できる。
orderメソッド
orderメソッドはoデータベースから取得してきた値(全て)を並び替えることができるメソッド。※なのでorderがある場合はallを省略できる。
モデル名.order("並び替えたいカラム名")
こんな感じ
User.order("name")
昇順にするなら
User.order("name ASC ")
降順にするなら
User.order("name DESC")
Rails でページネーション(ページ分け)を作る方法
STEP1 kaminari GEMをインストール
STEP2 変数名=クラスインスタンス.page(parasms[:page]).per(表示件数)
STEP3 ページネーションを出したい場所に<%= paginate 変数名 %>を入れる
def index
#例
@user = User.page(params[:page]).per(5)
end
devise:ログイン系一括でやっちゃうGem
deviseはgemの一種でRailsのアプリケーションに簡単にログインやログアウトなどの認証機能を実装できるものです。
<devise GEMの使い方>
①Gemインストール
②バンドルインストール
③ターミナルでrails g devise:install
④rails g devise User(使いたいモデル名)
⑤rake db:migrate
user_signed_in?メソッド
deviseをインストールすることによって「user_signed_in?」メソッドを使用することができる。これによってユーザーがサインインしているかどうかを検証することができる。
サインインしていない場合はfalseが返される。
Rails で<% %>はrubyタグ
ビューファイルが読み込まれる時にはHTMLコードとなって読み込まれる。以上。
link_toメソッド
まあ書くまでもないですが、HTMLでいうところのaタグの代わりになるものですね。
基本形
<%= link_to “リンク名”, パス, method: :postなど(メソッドなかったらgetになる) class: 'クラス名' %>
実際には
<%= link_to “編集”, "/user/#{@user.id}", method: :delete class: 'sample' %>
メソッドもクラス名も必要なければ要らない
ちなみにシングルクォテーションでは式展開できないので注意
prefixとは
プレフィックスはルーティングのパスに入る変数のこと。例えばdeviseジェムを入れると下記のようなプレフィックスが自動的に設定される。
もとも
/users/sign_in => devise/sessions#new
だったのが
new_user_session_path = devise/sessions#newみたいになる
で、これだと初見では何がどこにルーティングされているかわからないので、先ほどのrake routesで確認できる。
ちなみにプレフィックスを使う場合は最後に_pathをつける必要があるので、それが付いているやつはプレフィックスだと分かる。
unless文
unless文はifのfalseだけ取りたい場合に代わりに使うことができる。
unless
user.id == 1 redirect_to(“/top”)
end
みたいな感じ。