ルーティングを極める
読む
重要部分
namespace
namespaceを指定してパスをグループ化することができる。これを使用して、例えば管理用ページ(admin)のパスや置き場所を仕切ることができる。
namespace :page do
get :privacy_policy
get :company_information
get :term_of_use
get :businessdeal
end
上のように、名前付きルートとパスとコントローラ#アクションにpageが追加されました。
上は素朴なgetメソッドルーティングでしたが、resourcesルーティングに名前空間を与えることもできます。
namespace :admin do
resources :users
end
同じく、名前付きルートとパスとコントローラ#アクションにadminが追加されました。
:moduleオプションを使用して、resourcesに名前空間を与えることもできますが、これは上と少し動作が異なります。
resources :users, module: :admin
# 以下も大事
scope module: :admin do
resources :users
end
こちらはコントローラ#アクションにしか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
見ての通り、いつもの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
class User < ActiveRecord::Base
end
1,Controllerのnewメソッド
でModelオブジェクトを生成し、インスタンス変数(ex:@user)に値を設定 (@user = User.new
でUserはModelオブジェクト)
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オブジェクトのカラムを使用したフォームを作成し、表示する。
#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オブジェクトを作成
...
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