torutkのブログ

ソフトウェア・エンジニアのブログ

Redmineのプラグイン構造を探求する(コントローラ編の1)

モデル編の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$
プラグイン説明の修正

plugins/redmine_hello/init.rb を編集し、プラグインの説明等を記述します。
(修正しなくても動作はしますので、今回は編集をスキップします)

コントローラーの生成

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>
メッセージの修正

先ほど生成されたindex.html.erbの中身をHello Worldメッセージに修正します。

<h2>Hello, world, I'm Hello#index.</h2>
(気が早い)ブラウザからアクセス

プラグインHelloを作ったRedmineを実行します。RedmineRails)に同梱の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

ブラウザからアクセス

http://localhost:3000/hello

ここではエラーになります。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

ブラウザからアクセス

http://localhost:3000/hello

今度は無事メッセージが表示されました。