前田 稔です。先日、弊社のRedmineのクラウドサービス「My Redmine」のお客様からウォッチャーの追加に関する問い合わせがありました。その際に調査した内容をソースコードを踏まえて解説します。なお、Redmine のバージョンアップにより挙動が変わる可能性がありますのでご了承ください。
この記事は Redmine Advent Calendar 2025 - Adventar 3日目の記事です。
動作を確認した環境は以下の通りです。Redmine 6.1.0 を使用しています。
Environment: Redmine version 6.1.0.stable Ruby version 3.4.7-p58 (2025-10-08) [x86_64-linux] Rails version 7.2.2.2 Environment development Database adapter PostgreSQL Mailer queue ActiveJob::QueueAdapters::AsyncAdapter Mailer delivery smtp Redmine settings: Redmine theme Default SCM: Subversion 1.14.5 Git 2.51.1 Filesystem Redmine plugins: no plugin installed
Redmine には ウォッチ 機能といって、ウォッチ対象のチケットなどが更新されたときにメール通知を受け取る仕組みがあります。ウォッチャーの追加とは、特定の Redmine ユーザーをウォッチ対象に登録することを指します。
ソースコード上では、 Redmine::Acts::Watchable モジュールによって提供される機能で、 acts_as_watchable が宣言されたモデルに対してウォッチャーの追加が可能になります。
Redmine 6.1.0 では、以下の機能でウォッチャーを追加できます。
本記事は チケットのウォッチャー の追加に焦点を当てて説明します。
チケットのウォッチャーを追加するには、対象チケットが所属するプロジェクトにおいて、「ウォッチャーの追加」権限を持つロールが必要です。 ログイン中の Redmine ユーザーが所属するプロジェクトにおいて メンバー として割り当てられたロールにこの権限が含まれている場合、ウォッチャーの追加が可能になります。
公開プロジェクト に限っては、組み込みロール「 非メンバー 」や「 匿名ユーザー 」の「ウォッチャーの追加」権限を有効にすることで、プロジェクトに所属していない非メンバーの Redmine ユーザーや匿名ユーザー( 認証が不要な Redmine で未ログイン状態)でもウォッチャーの追加が可能になります。
「ウォッチャーの追加」モーダルの初期表示は該当プロジェクトに所属する有効なメンバーとグループが表示されます。なお、グループは組み込みグループ「非メンバー」や「匿名ユーザー」は除外されます。
「ウォッチャーの追加」モーダルでは「ユーザーの検索」欄にログインIDや姓名、メールアドレスを入力して検索することもできます。 ユーザーの検索結果には、プロジェクトに所属するメンバーと グループ に加えて、ログイン中の Redmine ユーザーに割り当てられているロールの「表示できるユーザー」設定によっては、プロジェクトのメンバーではないが該当チケットが閲覧できるユーザーやグループも検索結果に表示される場合があります。
なお、ウォッチャーになったときには該当チケットが閲覧できたが、ロールの設定の変更やプライベートチケットへの変更で閲覧権限がなくなった場合、 サイドバーに表示されるウォッチャーに警告マークが表示される ようになり、チケットを更新しても通知メールが送信されないことがあります。
前述の内容を踏まえて、ウォッチャーの追加に関する次の判定について詳解します。
詳解にあたって、組み込みロールおよび組み込みグループの役割と本記事での使われ方は以下の通りです。
| 名称 | 役割 | 本記事での使われ方 |
|---|---|---|
| 組み込みロール「非メンバー」 | プロジェクトのメンバーではないログインユーザーに対するデフォルト権限のセット | 公開プロジェクトで「ウォッチャーの追加」権限や「表示できるユーザー」設定を評価する対象 |
| 組み込みロール「匿名ユーザー」 | 未ログインユーザーに対するデフォルト権限のセット | 同上 |
| 組み込みグループ「非メンバー」 | プロジェクトのメンバーとして非メンバーを明示的に追加したいときに使うグループ | プロジェクトに追加されている場合、そのグループに割り当てたロールが優先して使われる場合がある |
| 組み込みグループ「匿名ユーザー」 | 匿名ユーザーをプロジェクトのメンバーとして扱いたい場合に使うグループ | 同上 |
ウォッチャーの追加権限有無の判定は User#allowed_to?(action, context, options={}, &block) メソッドで行われています。
https://github.com/redmine/redmine/blob/6.1.0/app/views/issues/show.html.erb#L150-L155 のように第2引数 context にチケットが所属するプロジェクトオブジェクトを渡すことで、アーカイブでないプロジェクトを対象に、 次の条件でロールと権限を判定 しています。なお、システム管理者権限を持つユーザーは無条件で権限を持ちます。
表にまとめると以下の通りです。
| No | プロジェクト公開設定 | 当該プロジェクトのメンバーか | プロジェクトに組み込みグループ「非メンバー」を追加しているか | 参照されるロール | 「ウォッチャーの追加」権限の可否 |
|---|---|---|---|---|---|
| 1 | 公開 / 非公開問わず | はい | (関係なし) | メンバーとして割り当てられたロール | そのロールに権限があれば 追加可 |
| 2 | 公開 | いいえ | はい | 組み込みグループ「非メンバー」に割り当てたロール | そのロールに権限があれば 追加可 |
| 3 | 公開 | いいえ | いいえ | 組み込みロール「非メンバー」 | そのロールに権限があれば 追加可 |
| 4 | 非公開 | いいえ | (関係なし) | ロールなし | 権限がないため 追加不可 |
表にまとめると以下の通りです。
| No | プロジェクト公開設定 | プロジェクトに組み込みグループ「匿名ユーザー」を追加しているか | 参照されるロール | 「ウォッチャーの追加」権限の可否 |
|---|---|---|---|---|
| 1 | 公開 | はい | 組み込みグループ「匿名ユーザー」に割り当てたロール | そのロールに権限があれば 追加可 |
| 2 | 公開 | いいえ | 組み込みロール「匿名ユーザー」 | そのロールに権限があれば 追加可 |
| 3 | 非公開 | (関係なし) | ロールなし | 権限がないため 追加不可 |
「ウォッチャーの追加」モーダルでユーザーを検索した場合、 WatchersController#users_for_new_watcher メソッドで100件を上限に検索結果が表示されます。
検索対象としては、該当チケットが閲覧できる有効なユーザーとグループ を対象に、 次の条件でロールと「表示できるユーザー」設定を判定 しています。なお、グループは組み込みグループ「非メンバー」や「匿名ユーザー」は除外されます。また、システム管理者権限を持つユーザーは無条件で「すべてのアクティブなユーザー」を表示できるようになっています。
表にまとめると以下の通りです。
| No | ログインユーザーの状態 | どのロールを参照するか | 「表示できるユーザー」設定の評価 | 検索結果に出てくるユーザー |
|---|---|---|---|---|
| 1 | いずれかのプロジェクトでメンバーになっている | そのユーザーに割り当てられている全ロール | いずれか 1つでも 「すべてのアクティブなユーザー」なら | すべての有効なユーザー+グループ(※組み込みグループ「非メンバー」「匿名ユーザー」を除く) |
| 2 | どのプロジェクトのメンバーでもない | 組み込みロール「非メンバー」 | 「すべてのアクティブなユーザー」なら | すべての有効なユーザー+グループ(※同上) |
| 3 | 上記 1・2 どちらにも当てはまらない | (関係なし) | いずれも「すべてのアクティブなユーザー」ではない | 「見ることができるプロジェクトのメンバー」に限定 |
表にまとめると以下の通りです。
| No | 状態 | 参照されるロール | 「表示できるユーザー」設定 | 検索結果に出てくるユーザー |
|---|---|---|---|---|
| 1 | 匿名ユーザー | 組み込みロール「匿名ユーザー」 | 「すべてのアクティブなユーザー」なら | すべての有効なユーザー+グループ(※組み込みグループを除く) |
| 2 | 同上 | 同上 | 上記以外 | 「見ることができるプロジェクトのメンバー」に限定 |
Redmine のチケットにおけるウォッチャーの追加について挙動を解説しました。プロジェクトメンバーで割り当てられたロールと権限の「表示できるユーザー」設定がウォッチャーの追加に影響する点がポイントです。Redmine の運用にお役立ていただければ幸いです。
|
Redmineのテキスト書式を変換するプラグイン「Redmine Reformat」を試した結果をご紹介します。 |
|
2025年11月6日〜7日に島根県松江市で開催されたRubyWorld Conference 2025の参加レポートです。 |
|
iPadを宅配買取で売却しました。自宅にいながら買取を依頼できるのでとても便利でした。 |
|
2025年11月8日に松江で開催されたmruby (PicoRuby) を体験できるワークショップ mruby Girls Matsue 1stに参加しました。 |
|
MCP(Model Context Protocol)を使ってAI(Codex / ChatGPT)からRedmineを直接操作する方法を試してみました。 |
|
2025年12月17日 オライリー本の全冊公開日のお知らせ(もくもく勉強会も同時開催) ファーエンドテクノロジーが所蔵するオライリー本(全冊)公開日のご案内です。公開日には「もくもく勉強会」も同時開催します。 |
|
年末年始 休業のお知らせ(12/26午後〜1/4 休業) 年末年始は2025年12月26日(金)午後から2026年1月4日(日)まで休業いたします。 |
|
My Redmine 2026 新春アップデートのお知らせ(RedMica 4.0対応) 2025年12月中旬にMy Redmine 2026 新春アップデートを実施します。 |
|
請求関連書類がダウンロード可能になったことを通知バナーで確認できるようになりました 請求関連書類がダウンロード可能な状態になると、ご利用中のMy Redmineに通知バナーが表示されます。 |
|
Redmineの最新情報をメールでお知らせする「Redmine News」配信中 新バージョンやセキュリティ修正のリリース情報、そのほか最新情報を迅速にお届け |