LoginSignup
1
0

More than 3 years have passed since last update.

Redmine プラグインチュートリアル for V4.x系 国際化対応とテスト追加

Last updated at Posted at 2020-12-20

※ 本記事は Redmine Advent Calendar 2020の 21 日目の記事の続きです。

初めに

Redmine プラグインチュートリアル for V4.x系で、チュートリアルを一通り実施しました。
これだけでは少し物足りなので、ここからは本家原文にない、ちょっとしたおまけです。
国際化対応(言語切り替え対応)と、テストを追加してみましょう。

確認環境

国際化対応

日本語設定ファイル(ja.yml)の作成

プラグイン作成時に、英語表示の設定ファイルは、自動で作成されます。

チュートリアの権限の追加 の章での内容にさらに、label_poll: Pollを追加して以下のようにします。

plugins/polls/config/locales/en.yml
"en":
  permission_view_polls: View Polls
  permission_vote_polls: Vote Polls
  label_poll: Polls

同様に日本語表示の設定ファイルを作成します。

plugins/polls/config/locales/ja.yml
"ja":
  permission_view_polls: 投票 閲覧権限
  permission_vote_polls: 投票 投票権限
  label_poll: 投票

次はメニューのキャプションを国際化対応します

plugins/polls/init.rb
# (中略)
  menu(
    :project_menu,
    :polls,
    { controller: 'polls', action: 'index' },
    caption: :label_poll,
    after: :activity,
    param: :project_id
  )

これで、メニューや権限設定画面が日本語化されます

表示文言の国際化対応 (lメソッド)

Viewでの国際化対応には、lメソッド(えるめそっど)を使います。余談ですが、本家Railsでは、tメソッドを使いますが、RedMineではlメソッドに置き換わっています。若干紛らわしいの注意ですね。

Redmine 4.0(Rails 5.1)でのプラグイン作成について - torutkのブログ
Redmine Glossaryプラグイン再構築 - ソフトウェアエンジニアリング - Torutk

plugins/polls/app/views/polls/index.html.erb

<% content_for :header_tags do %>
    <%= stylesheet_link_tag 'voting', plugin: 'polls' %>
<% end %>
<% html_title l(:label_poll)%>

<h2><%=l(:label_poll)%></h2>
・・・

これで表示文言が変更されます。

テストの追加

チュートリアルのテストでは、Polllコントローラのindexで、Poll画面を開くテストだけですが、voteで「投票できているか」をテストできるようにしてみます。

fixture の作成

voteのテストを行うためには、DBにテストのためのPollモデルのデータを用意しておく必要があります。
そのためにFixtureをいう機能を使います。

polls.ymlというファイルを作成し、以下のように記載します。

plugins/polls/test/fixtures/polls.yml
polls_001:
  id: 1
  question: テスト質問
  'yes': 0
  'no': 0

注意:yes と no は'(シングルクオテーション)で囲まないとエラーになります。
(ここでかなり悩みました)

Rails テスティングガイド - Railsガイド
4.2.2 YAML
・・・
'yes'や'no'などのYAMLキーワードに似たキーについては、引用符で囲むことでYAMLパーサーが正常に動作できます。

test_indexの修正と、test_voteの追加

既存のtest_index の修正と合わせて、下記のtest_vote を追加します。

plugins/polls/test/functional/polls_controller_test.rb
require File.expand_path('../../test_helper', __FILE__)

class PollsControllerTest < ActionController::TestCase
  fixtures :projects, :users
  plugin_fixtures :polls

  def test_index
    # プロジェクトメンバーのセッション
    @request.session[:user_id] = 2

    # ロールに権限を追加
    Role.find(1).add_permission! :view_polls

    # 特定のモジュールの有効/無効を切り替える
    #roject.find(1).enabled_module_names = [:mymodule]

    get :index, :params => {project_id: 1}
    assert_response :success
    assert_template 'index'
  end

  def test_vote
    @request.session[:user_id] = 2
    Role.find(1).add_permission! :view_polls, :vote_polls

    post :vote, :params => {id: 1, answer: 'yes' }
    assert_redirected_to "/polls"

    get :index, :params => {project_id: 1}
    assert_include 'Yes</a> (1)', response.body
  end
end

正直、この辺の描きっぷりは、あまり自信のないところです。
あとでもう少ししっかりした書き方を確認したい・・・

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0