※ 本記事は [Redmine Advent Calendar 2020] (https://adventar.org/calendars/5392)の 21 日目の記事の続きです。
初めに
Redmine プラグインチュートリアル for V4.x系で、チュートリアルを一通り実施しました。
これだけでは少し物足りなので、ここからは本家原文にない、ちょっとしたおまけです。
国際化対応(言語切り替え対応)と、テストを追加してみましょう。
確認環境
- Ruby 2.6.6
- Rails 5.2.4.4
- Redmine 4.1.1
- 作成したプラグイン https://github.com/rbtgr/redmine_plugin_tutorial_polls
国際化対応
日本語設定ファイル(ja.yml)の作成
プラグイン作成時に、英語表示の設定ファイルは、自動で作成されます。
チュートリアの権限の追加
の章での内容にさらに、label_poll: Poll
を追加して以下のようにします。
"en":
permission_view_polls: View Polls
permission_vote_polls: Vote Polls
label_poll: Polls
同様に日本語表示の設定ファイルを作成します。
"ja":
permission_view_polls: 投票 閲覧権限
permission_vote_polls: 投票 投票権限
label_poll: 投票
次はメニューのキャプションを国際化対応します
# (中略)
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
<% 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
というファイルを作成し、以下のように記載します。
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
を追加します。
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
正直、この辺の描きっぷりは、あまり自信のないところです。
あとでもう少ししっかりした書き方を確認したい・・・