Ruby on Railsを基礎から学ぶ 第2回

〜コントローラとアクションの基本〜

 

前回、フォルダ構成を説明しました。

今回から結構フォルダの行き来がありますので、忘れたら、こっちをみてください。

さて、今日は新しいコントローラlessonコントローラを作成し、その中にいろいろなアクションを書いて試してみましょう。

 

1.おさらい コントローラをgenerateする

まず、新しいコントローラを作るために、自分で作ったアプリ(この場合dragon)フォルダに移動します。

そこで、新しく作るlessonコントローラを作ります。

 

#rails g controller lesson

 

画面には、このコントローラ作成で生成されたさまざまなファイルが標準出力に出力されます。

赤枠参照)

  ここでは、テストのフォルダは意識せず、

app/controllers/lesson.controller.rb

app/helpers/lesson.helper.rb

app/assets/javascripts/lesson.js.coffee

          /stylesheets/lesson.css.scss

この4つができたことに注意します。

一番肝心なのは、コントローラです。これさえあれば、とりあえず画面に何か出せます。

今回はこのコントローラファイルを中心に加工していきます。。

 

2.Routeファイルへの追加

もろもろのファイルが自動的に作成荒れました。次に、忘れないうちに、lessonコントローラのアクションを呼び出せるように、routes.rblessonを追加します。

場所は、

 

C:\rails\xxxx\config\routes.rb

 

このファイルにlesson/:actionを追加します。

 

Getコマンドで、lessonの全てのアクションを指定できるようにしました。

このソースは、routes.rbにそのままコピーして使用することができます。

Dragon::Application.routes.draw do

  root to: "top#index"

  get "about" => "top#about", as: "about"

 

  get "lesson/:action(/:name)" => "lesson"

 

end

上のソースは、lessonに存在するそれぞれのアクションアクション名で呼び出すことができるようにしました。

実際には、どのアクションをキックするかは、条件分岐や引数など、アクセスした人の条件によって変えることが多いので、このようなアクション名直接指定はあまり使われません。

今は、

 

http://localhost:3000/lesson/stepXX

 

このような形で、ブラウザにアクションのレスポンスを確認することができると思ってください。

 

今度は、LessonControllerクラスを修正します。上述したコントローラフォルダにあります。

 

C:\rails\dragon\app\controllers

 

自動生成されたLesson.controller.rbというファイルを

テキストエディタなどで開き、下記のように記載します。

(保存は必ずUTF-8(ボムなし)で)

 

# coding: utf-8

 

class LessonController < ApplicationController

 

   def step1

      render text: "よく来たな、#{params[:name]}のダンナ!"

   end

 

end

 

これはパラメータ(標準入力変数)であるparamsをつかって、

URLから入力された名前をHTML上に表示することができます。(実用性は全くありません^^;

 

編集が終わったら、動作を確認するために、

rubyプロンプト(またはターミナル)で、WEBサーバであるWEBrickを起動します。

 

#rails server

 

この状態で、ポート3000でWEBサーバ起動中です。

 

http://localhost:3000/lesson/step1?name=sasaki

 

このようにブラウザに入力してみましょう。(ここでいうパラメータはsasakiにしてます。)

・・・とまあ、アクションstep1sasakiというnameでアクセスして、無事サイトに表示されました。

ユーザ名をこんなURL欄に直接入力するなんて、ダサいというかありえないし、

そもそもport:3000がうざいなどあると思いますが、このあたりの設定については、また後々解説します。

ついでながら、port=80である通常のWEBサーバapacheなどは起動させないでおくのが賢明です。

Apacheとの連携もそのうちやります。)

 

3.いろいろなアクションを実装してみる

続いて、いろいろなアクションを実行してみましょう。

@render

さて、step1で、render textというのを使いましたが、これは簡単にテキストを表示できるコマンドで、自動的にHTMLを生成して、ブラウザに表示してくれる、と考えておいていいと思います。

 続いて、いわゆる標準入力(params)ですが、コントローラやアクション名も情報として持っています。

 

params[:controller]  コントローラ名

 params[:action] アクション名

 

step2のような書き方をすれば、使われたコントローラとアクションが確認できます。

 

Aredirectflash

リダイレクトは、redirect_toで簡単に行えます。

また、フラッシュを使って、リダイレクト時に送る情報を指定することができます。

Step34では、リダイレクトを行っています。

 

ただし、これだと、step3を経由したことがわかりづらいので、

Step5では、フラッシュを使って、step5メッセージを記憶して、stepに飛んでみましょう。

 

※実際には、フラッシュは、今までのセッション情報を破棄して(または障害などで破棄された)新しい変数を次のリクエストに送ることができるので、エラー画面などに使われます。

 

■実行例■リダイレクション(step3 → step4

http://localhost:3000/lesson/step3

 

■実行例■フラッシュ(step5 → step6

http://localhost:3000/lesson/step5

補足 flash 種類

1. flash

1リクエスト間で値が保持される。

メソッドAで定義すれば、メソッドBでも利用可能。

メソッドBが実行された時点で破棄される。

 

2. flash.now

定義したメソッド内のみで利用可能。

メソッドAで定義した場合、メソッドBでは利用不可。

 

3. flash.keep

値を保持し続ける。

引数なしで .keep を指定すればすべての flash が保持される。

 

 

Bフィルタ

 最後にフィルタをやります。

 フィルタは、あるアクションの前後に決まったアクションを実行させたいときに使用します。

 たとえば、WEBページでの更新処理の前に、データが最新になっているかを確認するアクションをいれたいなどの場合に有効です。

 Step7の例では、アクションdo_beforestep7の前に(before)だけ(only)実行します。

 Onlyを取り除けば、全てに適用されますし、カンマで複数のアクションを指定することもできます。

 exceptを指定すると、それのみフィルタ処理されません。

 また、あるアクションの前後両方で実行したい場合は、aroundを使います。

 

■実行例■フィルタ(do_before → step7

http://localhost:3000/lesson/step7

 

最後に、今回のまとめとなるソースコードです。

このソースだけでなく、2.Routeファイルへの追加」も忘れずに行ってください。

◆ソースコード◆

格納先:C:\rails\xxxx\app\controllers

→ファイル名lesson_controller.rb

# coding: utf-8

 

class LessonController < ApplicationController

  before_filter :do_before, only: :step7

 

  def step1

    render text: "よく来たな、#{params[:name]}のダンナ!"

  end

 

  def step2

    render text: params[:controller] + "#" + params[:action]

  end

 

  def step3

    redirect_to action: "step4"

  end

 

  def step4

    render text: "step4に移動しました。"

  end

 

  def step5

    flash[:err] = "エラーです。step6に移動します。"

    redirect_to action: "step6"

  end

 

  def step6

    render text: flash[:err]

  end

 

  def step7

    render text: @message

  end

 

  private

  def do_before

    @message = "よく来たな!"

  End

end

 

 

次回は、埋め込み(テンプレート)とヘルパーメソッドをやっていきます。

ここからはファイルの行き来が非常に多くなりますので、フォルダ構成をよくおさらいしておきましょう。。

 

     参考テキスト■

サ改定新版 基礎 Ruby on Rails オイアクス監修 インプレスジャパン

http://www.oiax.jp/rails3book

 

 

戻るとっぷ次へ

 

Raccoon's homepage Copyright (C) 2000-2013 あらいベアー