やることのスケールが大きくなってきたので一気にやることが増えた。
と同時に1つの事象に対して見るべき範囲が広すぎて、こつこつ勉強するというよりはやりながら覚えるしかない感じ。ある程度直感で適当にやってみて、エラーが出てから書き直す方が効率いい気がする。
「記憶は外付け」っていう私の大好きな言葉がある。
今の時代、検索すれば答えなんて簡単に見つかるし、わざわざ人間が覚えておく必要はないよね。
無理して覚えるくらいなら使い方だけ学んで、あとはGoogle先生に頼りましょう。
やったことメモ
railsの重要な流れ routs.rb ↓ users_controller.rb user.rb User modelclass名 usersテーブル ↓ index.html.erb etc.
Rails 新規プロジェクトの作成
プロジェクトを作成する。
rails new project名 -d mysql
projectフォルダに移ってデータベースを作成。
cd project名
rake db:create
最初にルーティングをする。
project名/cofig/routes.rb
Rails.application.routes.draw do
get 'hogehoge' => 'hogehoge#index'
end
コントローラーはまだ存在していないためgenerateする。
場所はprojectフォルダで。
rails g controller hogehoge
project/app/controllerにhogehoge_controller.rbが作成されるので先ほど指定したアクション(index)を定義する。
class HogehogeController < ApplicationController
def index
end
end
次にビューファイルの作成。
project/app/views/hogehoge にindex.html.erbを作成。
controllerのメソッド1つに対して1対1で対応させる。
つまりメソッドの数だけhtml.erbを作る。
ここは手動。中身も必要に応じて書きます。
次にproject/app/assets/stylesheets の中にhogehoge.scssが作成されているので必要に応じて編集。
続いてDB周り。
前回作ったController(hogehoge)に対応するmodelを作成します。
注意点は単数形にすることです。
rails g model hogehoge
主に作成されるのは以下の2つ
create db/migrate/20190716034206_create_hogehoges.rb
create app/models/hogehoge.rb
1つ目のmigrationファイルを編集してデータベースを作成します。
class CreateHogehoges < ActiveRecord::Migration[5.2]
def change
create_table :tweets do |t|
t.text :text
t.timestamps null:true
end
end
end
t.型 :カラム名で指定します。
編集が終われば以下を実行します。
rake db:migrate
controllerで情報を取り出して、html.erbへ出力する。
modelクラスを利用して情報をDBから取り出す。
class HogehogesController < ApplicationController
def index
@hogehoges = Hogehoge.all
end
end
.all .findなどは生成されたmodelクラスがApplicationRecordというクラスを継承しているため初めから使えます。
app/models内のモデル名.rbを参照するとわかります。
続いてhtml.erbを編集
<% @hogehoges.each do |hogehoge| %>
<%= hogehoge.text %>
<% end %>
hogehoge.textとすることで.textでカラム名を指定してプロパティを取得できます。
html.erb内では改行が読まれなかったり、画像参照もimg_tagを使用しないと機能しません。
rubyタグ
<% %> 返り値をビューに出力しない。
<%= %> 返り値をビューに出力する。
<% -%> 余計な改行を取り除く。
link_toメソッド
rubyタグ内で使用できる。htmlのaタグへ変換される。
例として上のメソッドはhtml.erbからhtmlへ変換される際に自動的に変換される。
<%= link_to '記事一覧へ', '/hogehoge', class: 'sample' %>
<a class="sample" href="/hogehoge">記事一覧へ</a>
simple_format
rubyタグ内では改行が無視されるため、改行も出力したい場合に使う。
<%= simple_format(text) %>
img_tag
<%= img_tag 'cat1.png'%>
フォームに入力
<% form_tag(‘パス’, method: :getまたは:post) do %>
form_tag
<%= form_tag('/hogehoge', method: :post, class: "clearfix") do %>
<%= image_tag 'hogehoge.png'%>
<input placeholder="Nickname" type="text" name="name">
<textarea cols="30" rows="4" name="text" ></textarea>
<input type="submit" class="submit-button">
<% end %>
1行目の引数の1つ目はリクエストのパスを。
2つ目はhttpメソッドをpostにするという意味。
httpメソッドは情報をサーバーから得る時はget、送信するときにはpostを使う。
フォームに入力された内容はparamsに格納されて次のコントローラーに渡される。paramsの中身はname=””で指定した値をキーに持つハッシュとなっている。
params[:name] ==> ”hoge”
という風に情報を取り出せます。
入力内容を保存
ルーティングでpostがリクエストされた時の動作を設定。
post 'hogehoge' => 'hogehoge#create'
コントローラーで.createメソッドを使って保存する。
def create
Hogehoge.create(hogehoge_params)
end
private
def hogehoge_params
params.permit(:text)
end
.createメソッドの引数は(key: value、key: value、・・・)という繰り返し。これはハッシュと同じ。
paramsは情報をハッシュとして持っているので、params.permitで抜粋したデータはそのまま.createメソッドの引数として使える。
.createメソッドは.newと.saveをまとめて行ってくれる。
以下のように引数を渡して保存するのと同義。
hogehoge = Hogehoge.new(name: "takashi", text: "Nice to meet you!")
hogehoge.save
コンテンツの並び替え
@contents = Content.all.order("id DESC")
昇順.order(“id ASC”) もしくは降順 .order(“id DESC”)で並べ替えます。
idにはカラム名を指定します。
ページネーションについて
ページ分割のこと。
gemのkaminariを利用して実装する。
gemfileに以下を追記してbundle install.
インストール後はrails sでサーバーを再起動します。
gem 'kaminari'
kaminariをインストールすると、pageメソッドとperメソッドを利用できるようになる。
さらにビューのリクエストの際paramsの中にpageというキーが追加されて、その値がビューで指定したページ番号となります。
.pageでページ番号を、.perで一度に表示するデータ数を指定する。
@hogehoge = Modelclass.all.page(params[:page]).per(5)
paginateメソッドはページリンクを作る。
html.erbの必要な箇所に以下を追記する。
<%= paginate(@tweets) %>
ログイン機能の実装
gemのdeviseを利用して実装する。
gemfileに以下を追記してbundle install。
サーバーも再起動する。
gem 'devise'
rails s
deviseの設定ファイルを作るために下を実行。
rails g devise:install
userモデルを作成します。
今までのrails g model hogehogeではなく、devise用のコマンドを利用します。
rails g devise user
実行すると、モデルクラスとmigrationファイルができます。
ついでにroutes.rbにdevise_for :usersが追記されます。
create db/migrate/20190716082131_devise_create_users.rb
create app/models/user.rb
create test/models/user_test.rb
create test/fixtures/users.yml
insert app/models/user.rb
route devise_for :users
devise_forはログインまわりに必要なルーティングを一気に生成してくれるdeviseのヘルパーメソッドです。
migrationファイルもできたのでDBも作成します。
rake db:migrate
user_signed_in?
ユーザーがサインインしているかどうか検証するメソッドです。
サインインしている場合にはtrue
を返し、サインインしていない場合にはfalse
を返します。
<% if user_signed_in? %>
# ユーザーがサインインしている場合に実行する処理
<% end %>
deviseでログイン機能を実装した場合の追加処理
通常、入力した情報はパラメーターとして受け取り、コントローラーのストロングパラメーターで制御できる。
deviseでログイン機能を実装した場合、ログイン時に送られてくるパラメーターを制限するストロングパラメーターは、deviseのGem内に記述されているため編集できない。
configure_permitted_parametersメソッドを用いて追加したいキーを指定する。
application_controller.rbにbefore_actionで記述する。
before_action :configure_permitted_parameters, if: :devise_controller?
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:ストロングパラメーターを追加したいアクション名, keys: [:追加するキー])
end
ユーザーページの実装
ユーザー個別のページは/users/1 ~ /users/99などと振られるIDによりページ名が異なる。
Rails.application.routes.draw do
devise_for :users
get 'users/:id' => 'users#show'
end
users/:idとすることでパラメーターにハッシュ形式で値を持たせることができる。params[:id]とすればコントローラーがidを取り出せる。
redirect_toメソッド
アクション → ビューが通常の流れだが、アクション内でredirect_toメソッドを行うことで別のアクションを実行したり、別のビューへ誘導できる。
def move_to_index
redirect_to action: :index
# indexアクションを強制的に実行する
end
引数にはaction: :indexという形で、キーがaction:バリューが:indexであるハッシュを指定する。
つまりredirect_to{action: :index}が精確だが、railsではハッシュの{}は省略しても良い。
before_actionメソッド
コントローラーでbefore_action :メソッド名 と指定することによってアクションが実行される前に、特定のメソッドを実行できる。
なおonlyやexceptを用いて制限することもできる。
before_action :hoge, except: :index
# indexアクション以外が実行される前にhogeが実行される。
unless文
if文の逆で上限がflaseの時に実行。
if文もunless文も1行で条件が表記できる場合は1行で表記できる。
puts 'ログインをしてください' unless user_signed_in?
# 以下と同義
unless user_signed_in?
puts 'ログインをしてください'
end
テーブルへカラムの追加
追加するためのmigrationファイルを作成します。
rails g migration AddIntroductionToUsers introduction:text
Addカラム名Toテーブル名 追加するカラム:型
Addの後のカラム名に関してはなんでもいい。
AddColumnToUser とか。見てわかりやすい名称が望ましいだけなので好みで。
ヘルパーメソッド
html.erb内で、railsの記述は改行を無視するので、simple_format()を使う。
link_toやform_tagなどとまとめてヘルパーメソッドという。
img_tag
html.erb内の記述ではhtmlの記述のままで使えないのでimage_tagで書き換えます。
<%= image_tag 'cat1.png'%>
<img src="images/cat1.png">
pry-rails
デバッグツール。
binding.pryをソースコードの中に記述することで処理を止めることができる。止めた処理はexitで再開。exit!でサーバーを止める。止めた時点での変数を出力したりすることで処理が正しく行われているか確認できる。
gemのインストール
gemをインストールする際にはgemfileに gem ‘hogehoge’と書いて、bundle installを実行。
テーブルのプロパティ
table.propertyで取り出せる。
ハッシュ
hash[:key]で取り出せる。
フォントファイルの置き場は
app/assets/fonts/
fontsフォルダは存在しないので作成する。
コメント