Redmine のチケット一括編集 (bulk edit) で必須のフィールドを入力できなくてチケットを更新できない

# 環境

* Redmine 3.2.1

# 問題

ググっても関係する情報をうまく見つけられなかった。以下の URL 先で同じような問題の報告が見つかった程度。

"Error : Bulk edit selected issues with custom field"
https://www.redmine.org/boards/2/topics/42818

ワークフローの「フィールドに対する権限」の設定で

1. ステータス 1 でフィールド A を読み取り専用
2. ステータス 2 でフィールド A を必須

にできる。

ステータス 1 からステータス 2 に更新するとき、

1. 編集フォームを開いた時点ではステータス 1 が選択されておりフィールド A は読み取り専用なので表示されず入力できない。
2. 単体のチケット編集のページではステータスの選択に合わせて編集フォームが更新され、ステータス 2 を選択すればフィールド A を入力できる。
3. チケット一括編集のページでは、ステータスの選択に合わせて編集フォームが更新されない。そのため、フィールド A を入力できなくてチケットをステータス 2 に更新できない。

例えば、以下の画像では

1. 新規で対象バージョンを読み取り専用
2. 進行中で対象バージョンを必須

にしている。

![Screen Shot 2016-05-02 at 23.43.00.png](https://qiita-image-store.s3.amazonaws.com/0/38075/d70a99fb-a120-6d57-65fe-e169161b9100.png)

単体の編集では、以下のように新規では対象バージョンが表示されないが、

![Screen Shot 2016-05-02 at 23.52.35.png](https://qiita-image-store.s3.amazonaws.com/0/38075/31bfebfc-4c3a-aa40-3468-316382e1e9ed.png)

以下のように進行中に変更すると対象バージョンが表示されて入力できる。

![Screen Shot 2016-05-02 at 23.52.48.png](https://qiita-image-store.s3.amazonaws.com/0/38075/c1a7e120-59d9-792b-8ad7-578ae7bf9ba3.png)

一方、一括編集では以下のように新規のチケットを進行中にできない。

![Screen Shot 2016-05-02 at 23.53.36.png](https://qiita-image-store.s3.amazonaws.com/0/38075/219de4e4-dc41-5618-beb5-e8c728119165.png)

# 修正

一括編集でも、プロジェクトの選択に対しては以下のように編集フォームが更新されるようになっている。

http://www.redmine.org/projects/redmine/repository/entry/tags/3.2.1/app/views/issues/bulk_edit.html.erb#L39

それを真似して以下のようにステータスの方にも付ける。

```diff
--- a/redmine-3.2.1/app/views/issues/bulk_edit.html.erb	2016-03-14 02:18:44.000000000 +0900
+++ b/redmine-3.2.1/app/views/issues/bulk_edit.html.erb	2016-05-03 00:56:44.974966723 +0900
@@ -50,7 +50,8 @@
   <label for='issue_status_id'><%= l(:field_status) %></label>
   <%= select_tag('issue[status_id]',
                  content_tag('option', l(:label_no_change_option), :value => '') +
-                   options_from_collection_for_select(@available_statuses, :id, :name, @issue_params[:status_id])) %>
+                   options_from_collection_for_select(@available_statuses, :id, :name, @issue_params[:status_id]),
+                 :onchange => "updateBulkEditFrom('#{escape_javascript url_for(:action => 'bulk_edit', :format => 'js')}')") %>
 </p>
 <% end %>
 
```

そして、以下の `update_issue_from_params` の処理を真似して、

http://www.redmine.org/projects/redmine/repository/entry/tags/3.2.1/app/controllers/issues_controller.rb#L376

以下のように修正する。

```diff
--- a/redmine-3.2.1/app/controllers/issues_controller.rb	2016-03-14 02:18:43.000000000 +0900
+++ b/redmine-3.2.1/app/controllers/issues_controller.rb	2016-05-03 01:19:02.511829551 +0900
@@ -223,6 +223,10 @@
     end
     target_projects ||= @projects
 
+    @issue_params = params[:issue] || {}
+    @issue_params[:custom_field_values] ||= {}
+    @issues.each {|i| i.safe_attributes = @issue_params} if params[:issue]
+
     if @copy
       # Copied issues will get their default statuses
       @available_statuses = []
@@ -240,9 +244,6 @@
     end
 
     @safe_attributes = @issues.map(&:safe_attribute_names).reduce(:&)
-
-    @issue_params = params[:issue] || {}
-    @issue_params[:custom_field_values] ||= {}
   end
 
   def bulk_update
```

これで一括編集でもステータスに合わせて編集フォームが更新されて必須のフィールドを入力できるようになった。
ただし副作用がないか心配。