LoginSignup
0

More than 1 year has 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

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

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
What you can do with signing up
0