2014年6月26日木曜日

2-3 コントローラ

 まずはコントローラ作成。
$ rails g controller books
booksの部分、コントローラの性質によって複数形にするかは常識的に判断とえらい人が言っていたがイマイチピンとこない。モデル持つような場合、基本的に複数になるとか、そんな感じかな。
 コントローラの設定としては、app/controllers/books_controller.rb。ここにアクションを書く。問い合わせに対してどんな回答をするかってのをアクションとして定義する。
def show
@book = Book.find(params[:id])
respond_to do |format|
format.html
format.csv
format.json
end
end
 /books/1とかでアクセスが来たときには、この1がparams[:id]として処理される。レコードごとのページの表示とか、かな。
 respond_to doの部分では、ユーザーのリクエストに応じて3種類のビューのレンダリングができるようになっています。

アクションコールバック

 モデルと同じように、アクションにもコールバックがある。
  before_action :set_book, only: [:show, :edit, :update, :destroy]
  private
  def set_book
  @book = Book.find(params[:id])
  end
 なんでprivateなの?とりあえずprivateにすると、自クラスかサブクラスからしか呼び出せないみたい。
 親クラスで定義したアクションコールバックをskip_before_actionのようなskipメソッドもある。

ルーティングとresources

 resourcesをネストすると、親子関係をルーティングで表すことができる。/publisher/:publisher_id/books/:idとか。
 一人のユーザーから見て一つしか存在しないリソースの場合には、resourceでルーティングを定義することも可能。この場合はindexは作られず、:idによる絞り込みも設定されない。
 resource(s)で、:onlyを使うと、特定のアクションのみについてルーティングを設定することができる。下記ではshow/edit/updateだけ定義される。
resources :profile, only: %i{show edit update}

 例外処理

 一般のWEBサーバーのHTTPステータスコードとは別に、Rails独自のものがある。p71参照。
 クラスメソッドrescue_fromと合わせると特定の例外に特定の処理をひも付けしやすい。多くの場合、ApplicationControllerに宣言する。
class LoginFailed < StandardError
end
class ApplicationCntroller < action_controller::Base
  rescue_from loginFailed, with: :login_failed
  def login_failed
    render templete: 'shared/login_failed', status: 401
  end
end

StrongParameter 

 Rails4で実装されたStrongParameterは脆弱性に対抗する手段の一つ。
 あー、だめだ。眠い。p73あたりはまともなサイト作るときにもう一度読み直そう。
 scaffoldで生成されるコードにはStrongParametersを使うようになっているそうだし。

0 件のコメント:

コメントを投稿