モデル編の2(id:torutk:20171108)でいったんモデルの探求を中止し、ブラウザからのリクエストを受けるコントローラを探ることとします。
まずはHello World
WebブラウザからURLを直接入力して、プラグインで用意したHello Worldメッセージを表示するだけの仕組みを作ります。
項目 | 値 |
---|---|
プラグイン名 | redmine_hello |
コントローラー名 | hello |
メソッド | index |
プラグインの雛形を生成
bundle exec で railsコマンドを実行します。railsコマンドのオプションで、Redmineのプラグインを、redmine_hello という名前で生成(generate)させることを指定します。
3.4-stable$ bundle exec rails generate redmine_plugin redmine_hello create plugins/redmine_hello/app create plugins/redmine_hello/app/controllers create plugins/redmine_hello/app/helpers create plugins/redmine_hello/app/models create plugins/redmine_hello/app/views create plugins/redmine_hello/db/migrate create plugins/redmine_hello/lib/tasks create plugins/redmine_hello/assets/images create plugins/redmine_hello/assets/javascripts create plugins/redmine_hello/assets/stylesheets create plugins/redmine_hello/config/locales create plugins/redmine_hello/test create plugins/redmine_hello/test/fixtures create plugins/redmine_hello/test/unit create plugins/redmine_hello/test/functional create plugins/redmine_hello/test/integration create plugins/redmine_hello/README.rdoc create plugins/redmine_hello/init.rb create plugins/redmine_hello/config/routes.rb create plugins/redmine_hello/config/locales/en.yml create plugins/redmine_hello/test/test_helper.rb 3.4-stable$
コントローラーの生成
bundle exec で railsコマンドを実行します。railsコマンドのオプションで、Redmineのプラグインのコントローラを、hello という名前で、indexアクションを持つよう生成(generate)させることを指定します。
~/redmine/3.4-stable$ bundle exec rails generate redmine_plugin_controller redmine_hello hello index create plugins/redmine_hello/app/controllers/hello_controller.rb create plugins/redmine_hello/app/helpers/hello_helper.rb create plugins/redmine_hello/test/functional/hello_controller_test.rb create plugins/redmine_hello/app/views/hello/index.html.erb 3.4-stable$
生成されたコントローラーの雛形(hello_controller.rb)には、indexメソッドが(中身は空で)定義されています。また、コントローラーのindexに対応するビュー(index.html.erb)も合わせて生成されます。
コントローラー名の指定において、指定した名前が単数形と複数形とで振る舞いが変わるようです(今後調査する)。
ちなみに、railsコマンドで最後にアクションを1つも指定しない場合は、コントローラークラスにはメソッドが何も定義されず、ビューも生成されません。アクションは、index以外にshow, edit, newなどか?
- hello_controller.rbの中身
class HelloController < ApplicationController unloadable def index end end
- index.html.erbの中身
<h2>HelloController#index</h2>
(気が早い)ブラウザからアクセス
プラグインHelloを作ったRedmineを実行します。Redmine(Rails)に同梱のWEBrickサーバーを実行し、ローカルマシン上のブラウザからURLを直打ちしてアクセスします。
3.4-stable$ bundle exec rails server => Booting WEBrick => Rails 4.2.8 application starting in development on http://localhost:3000 => Run `rails server -h` for more startup options => Ctrl-C to shutdown server [2017-11-12 13:00:18] INFO WEBrick 1.3.1 [2017-11-12 13:00:18] INFO ruby 2.1.9 (2016-03-30) [x86_64-linux-gnu] [2017-11-12 13:00:18] INFO WEBrick::HTTPServer#start: pid=134 port=3000
ブラウザからアクセス
ここではエラーになります。URLのhelloに対するルート定義が未定義のためです。
Routing Error
No route matches [GET] "/hello"
ルート定義はリクエストURLの指定(例:/hello/213/show)を、どのコントローラーとそのアクションに紐づけるかを定義するものです。
ルート定義を記述
redmine_helloプラグインのconfig/routes.rb に、プラグインのルート定義を記述します。
# Plugin's routes # See: http://guides.rubyonrails.org/routing.html Rails.application.routes.draw do resources :hello end
このresources で指定したシンボルがリクエストURLの名前とコントローラー名とを紐づけます。
ここでは、リクエストURLの/hello が、コントローラーhelloのindexアクションに紐づけています。
HTTPコマンド | リクエストURL | コントローラー | アクション |
---|---|---|---|
GET | /hello | hello | index |
GET | /hello/new | hello | new |
POST | /hello/create | hello | create |
GET | /hello/:id | hello | show |
GET | /hello/:id/edit | hello | edit |
PATCH or PUT | /hello/:id | hello | update |
DELETE | /hello/:id | hello | destroy |
ブラウザからアクセス
今度は無事メッセージが表示されました。