TECH EXPERT 4日目

TECH::EXPERT

やることのスケールが大きくなってきたので一気にやることが増えた。
と同時に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フォルダは存在しないので作成する。

コメント