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.rbにlessonを追加します。
場所は、
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にしてます。)
・・・とまあ、アクションstep1にsasakiというnameでアクセスして、無事サイトに表示されました。
ユーザ名をこんなURL欄に直接入力するなんて、ダサいというかありえないし、
そもそもport:3000がうざいなどあると思いますが、このあたりの設定については、また後々解説します。
ついでながら、port=80である通常のWEBサーバ(apacheなどは起動させないでおくのが賢明です。
Apacheとの連携もそのうちやります。)
3.いろいろなアクションを実装してみる
続いて、いろいろなアクションを実行してみましょう。
@render
さて、step1で、render textというのを使いましたが、これは簡単にテキストを表示できるコマンドで、自動的にHTMLを生成して、ブラウザに表示してくれる、と考えておいていいと思います。
続いて、いわゆる標準入力(params)ですが、コントローラやアクション名も情報として持っています。
params[:controller] コントローラ名
params[:action] アクション名
step2のような書き方をすれば、使われたコントローラとアクションが確認できます。
Aredirectとflash
リダイレクトは、redirect_toで簡単に行えます。
また、フラッシュを使って、リダイレクト時に送る情報を指定することができます。
Step3、4では、リダイレクトを行っています。
ただし、これだと、step3を経由したことがわかりづらいので、
Step5では、フラッシュを使って、step5のメッセージを記憶して、step6に飛んでみましょう。
※実際には、フラッシュは、今までのセッション情報を破棄して(または障害などで破棄された)新しい変数を次のリクエストに送ることができるので、エラー画面などに使われます。 |
■実行例■リダイレクション(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_beforeをstep7の前に(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 オイアクス監修 インプレスジャパン
Raccoon's homepage Copyright
(C) 2000-2013 あらいベアー