【16日目:Railsでの大切な7つのアクション】改訂3版基礎Ruby on Railsを読んだで!

シェアする

  • このエントリーをはてなブックマークに追加
41AkxXsz+5L._SX258_BO1,204,203,200_

7つのアクション

RESTの原則に基づいてリソースを扱うコントローラを作っていく。

まずはMembersControllerの作成

bin/rails g controller members

その後に
routes.rbにルーティングの設定

resouces :members

を追記。
これで7つのアクションが使えるようになる。

つぎにMembersControllerに7つのアクションを記載。
アクションの名前は丸暗記すること。
※何も見ないでコントローラにアクションを書くことをめざす。

7つのアクションは。
index,show,new,edit,create,update,destroy

会員の一覧ページ作る

会員一覧を表示するindexアクションとそのテンプレートを実装する
※この本では会員を検索するsearchアクションも作る。

indexアクションを作る

_header.html.erbに会員名簿の行の”#”を:memberに変える
→リンク先をindexアクションになる。

members_controller.rbをにインデックスアクションを実装
クエリーメソッドのorderを使ってリレーションオブジェクトをインスタンス変数@membersに取り出す。
orderメソッドにより、並びは背番号順になる。

コントローラにアクションを記述できたら
ビューを作る。

app/viewにmembersというフォルダを作り、index.html.erbを作る
indexアクション用のテンプレを作って表示されているかを確認する。

スタイルの適用

index.html.erbにアクション用の記述を行なったら、
CSSでレイアウトを整えてあげる。

各種リンクの設置を行う。

次はindexアクション用のテンプレートに他のアクションへのリンクを付けてあげる。
ここらへんは224ページ見る。

searchアクションを作る。

アクションを追加するには、routes.rbへ追記する必要がある。

resources :members do
    collection { get "search" }
end

こう変更したあとに、コントローラを変更する。
→追加したいアクション(メソッド)を追記する。

def search
  @members = Member.search(params[:q])
  render "index"
end

render “index”によってindexアクションと同じファイルでレンダリングされる。
検索機能の実態をMemberクラスのsearchメソッドで実装する。

アクションを追加するときのアクションの記述はできるだけ簡潔に行う。
コードが長くなりそうならモデルクラスに機能を移す。

ルーティングの設定を行ない、アクションを追加したら次はMemberクラスにクラスメソッドを作る。
引数のワードが空でなければSQLのLIKEを使ってユーザー名または氏名から検索するリレーショナルオブジェクトを作成する。※モデルを編集する。

class Member < ActiveRecord::Base
  class << self
    def search(query)
      rel = order("number")
      if query.present?
        rel = rel.where("name LIKE ? OR full_name LIKE ?",
          "%#{query}%", "%#{query}%")
      end
      rel
    end
  end
end

これは226ページの解説を読んで各箇所の復習をしたほうが良い。

モデルの記述が終わったら、検索用のフォームを設置してあげる。
※この検索用フォーム設置もform_tagの説明があるので227ページの解説を読むこと。

会員の詳細ページ

会員情報の詳細をつくる。1つのレコードの核絡むの値を表示するページを作る。
showアクションではfindメソッドにidパラメータを渡す。
そしてfindメソッドが返すモデルオブジェクトを変数@memberに入れる。

findメソッドでインスタンス変数に値を渡せたら、テンプレートにshow.html.erbを作って
モデルオブジェクトの@memberの属性を並べてあげる。

注意点!!

コントローラやテンプレートの中でインスタンス変数のつづりを間違えるとNoMethodErrorというエラーがある
これはスペルミスの場合はインスタンス変数の値がnilになりnilにはnumberなどのメソッドがないから。
メソッドが入ってない場合でなくてもスペルミスでもNoMethodErrorというのが表示されるのでスペルミスには注意が必要。

今日は長かったな、ここまでにしよう。

本記事は下記本の勉強記事です。初学者にとても良い本です。

スポンサーリンク
Sponsored Link
Sponsored Link

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
Sponsored Link