Ruby

インターン 2日目(1月30日)

ルーティングを極める
読む
重要部分

namespace
namespaceを指定してパスをグループ化することができる。これを使用して、例えば管理用ページ(admin)のパスや置き場所を仕切ることができる。

namespace :page do
  get :privacy_policy
  get :company_information
  get :term_of_use
  get :businessdeal
end

スクリーンショット 0030-01-30 午前5.10.20.png
上のように、名前付きルートとパスとコントローラ#アクションにpageが追加されました。
上は素朴なgetメソッドルーティングでしたが、resourcesルーティングに名前空間を与えることもできます。

namespace :admin do
  resources :users
end

スクリーンショット 0030-01-30 午前5.13.12.png

同じく、名前付きルートとパスとコントローラ#アクションにadminが追加されました。
:moduleオプションを使用して、resourcesに名前空間を与えることもできますが、これは上と少し動作が異なります。

resources :users, module: :admin

# 以下も大事
scope module: :admin do
  resources :users
end

スクリーンショット 0030-01-30 午前5.16.22.png

こちらはコントローラ#アクションにしかadmin名前空間が追加されていません。
ここからわかるように、パスには表したくないが別のディレクトリにまとめたいコントローラがある場合に使用できる。

collectionとmenmber
resourcesを使えば、主要な7つのルーティングが自動的に追加されますが、それ以外のルーティングそのリソースに追加したい場合はmemberまたはcollectionを使用します。
「collection(集合)はidなし、member(個別)はidあり」と覚える。

resources :books do
  collection do
    post :search
    post :remove_multi
  end
  member do
    get :thumbnail
    get :sample_file
  end
end

スクリーンショット 0030-01-30 午前5.19.57.png

見ての通り、いつもの7つのルーティングに加えて4つのルーティングがある。
そしてcollectionで指定した2つにはidはなく、memberで指定した2つにはidがある。
以下のような簡易版もある

resources :books do
  post :search, on: :collection
  get :thumbnail, on: :member
end

何も指定しない時はデフォルトでmember扱い

root

root to: 'pages#top'

オプション指定

onlyとexceptionオプション
主要なアクション(index,show,new,create,edit,update,destroy)を限定できる。

#indexとshowアクションだけを使用する
resources :prefectures, only: [:index, :show]
#destroyアクション以外を使用する
resources :prefectures, except: :destroy

実際にやる

headerとfooterを作る
bootstrapで作る。
導入方法

Less:「The Dynamic Stylesheet language」の略。Node.js パッケージでインストールすることが多い。
Sass:「Syntactically Awesome Style Sheets」の略。Ruby ベースなので gem でインストールする。
Scss:Sass の表記法の1つ。元々の Sass がブレース {} を使わない記法だったりするのに対し、Scss はブレースを使うのでピュアな CSS っぽい見た目で書ける。

二つのgemを追加する必要があったけれど、gem 'sass-rails'はもともとあったからもともとある方を残した。
色々あって導入は完了。

bootstrapでheaderとfooterを代入する。
renderと_header.html.erb,_footer.html.erbができた。
rails sができない
= > エラー routeのエラーが出てた

root to: 'home/top'

rootの書き方はあってる。
間違いは/#にする必要があり、解決。
他のファイルから呼び出す
 headerでリンク移動ができるようにlink_to(http://railsdoc.com/references/link_to)
link_toにクラスをもたせたい
これにてheaderは完成。

次は、申し込みフォームを作る。
申し込みフォールの処理のフローは以下

1,ControllerのnewメソッドでModelオブジェクトを生成し、インスタンス変数(ex:@user)に値を設定 (@user = User.newでUserはModelオブジェクト)
2,Viewのform_forメソッドでModelオブジェクトのカラムを使用したフォームを作成し、表示する。
3,ユーザーがsubmitすると、params変数に入力したパラメーターがハッシュの形で設定されてControllerに届く。
4,Controllerのcreateメソッドでparams変数でModelオブジェクトを作成する。

新規登録のフロー(詳細)
0,前提
Userテーブルには必要なカラムが存在していて,user.rbカラムが作成されている。

データベースオブジェクトの命名規約
①全般
1,大文字を使用しない
テーブル名、カラム名共に大文字を利用しない。
(DBにより、大文字小文字を区別するもの、しないものがあるから)
2,複数単語の連携がスネークケース
テーブル名、カラム名ともにスネークケースを利用する。
ex)table_name
3,英語表記
基本的にはローマ字ではなく、英語で。
4,略名は利用しない。
× start_dt
○ start_date
②テーブル
1,基本系は~s(複数形)
2,n:nのテーブル
~s(複数形)+ "" +~s(複数形)
ex)users
categories

カラムの型

app/model/user.rb
class User < ActiveRecord::Base
end

1,ControllerのnewメソッドでModelオブジェクトを生成し、インスタンス変数(ex:@user)に値を設定 (@user = User.newでUserはModelオブジェクト)

app/controllers/users_controller.rb
def new
  @user = User.new
end

end
#@userに空のModelオブジェクトを作成し、インスタンス変数@userに設定
#@userはviewでも使えるインスタンス変数
#Controllerでrenderやredirect_toなどで明示的にレンダリングするviewをしていない場合は、メソッド名のViewファイルがレンダリングされる。(ex:new => new.html.erb)

2,Viewのform_forメソッドでModelオブジェクトのカラムを使用したフォームを作成し、表示する。

app/view/users/new.html.erb
#form_forに @userを渡すことにより、Userテーブルのテキストフィールドやラベルなどのinput要素を簡易に作成することができる
#今回は例として、nameとemailのカラムを持つとする。
<%= form_for @user do |f| %>

  <div class="field">
    <%= f.label :name, "名前" %>
    <%= f.text_field :name %>
  </div>

  <div class="field">
    <%= f.label :email, "メールアドレス" %>
    <%= f.text_field :email %>
  </div>

  <div class="actions">
    <%= f.submit "登録する" %>
  </div>
<% end %>

この記述の例である

<%= f.label :name, "名前" %>
<%= f.text_field :name %>

は以下のようにhtml表記される

<div class="field">
  <label for="user_name">名前</label>
  <input id="user_name" name="user[name]" type="text">
</div>

3,ユーザーがsubmitすると、params変数に入力したパラメーターがハッシュの形で設定されてControllerに届く。

先ほどの、input要素name属性をキーとしてハッシュ形式でparamsに設定される。

params =
{
 user:{# params[:user]で{ name: "鈴木", email: "suzu..." }を取得可能
  name: "鈴木", #params[:user][:name]で値を取得可能
  email: "suzuki@example.com" #params[:user][:email]で値を取得可能
 }
}

4,Controllerのcreateメソッドでparams変数でModelオブジェクトを作成

app/controllers/users_controller.rb
...
def create
 @user = User.new(user_params)
 if @user.save
  # @userはuser_path(@user)に自動変換される
   redict_to @user, notice: "ユーザ登録しました。"
 else
  #ValiationエラーなどでDBに保存できない場合 new.html.erbを再表示
   render 'new'
 end

 private
   #Rails4からStrongParameterと呼ばれる機能が追加
   #セキュリティのため、permitメソッドで許可したパラメータ名しか取得できません。
  def user_params
    params.require(:user).permit(:name, :email)
  end
end