diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index 4b1ecc221..dc2acee3a 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -51,8 +51,9 @@ class RepositoriesController < ApplicationController @users += User.find_all_by_id(additional_user_ids) unless additional_user_ids.empty? @users.compact! @users.sort! - if request.post? - @repository.committer_ids = params[:committers] + if request.post? && params[:committers].is_a?(Hash) + # Build a hash with repository usernames as keys and corresponding user ids as values + @repository.committer_ids = params[:committers].values.inject({}) {|h, c| h[c.first] = c.last; h} flash[:notice] = l(:notice_successful_update) redirect_to :action => 'committers', :id => @project end diff --git a/app/views/repositories/committers.rhtml b/app/views/repositories/committers.rhtml index 6e3ba83b4..597a414aa 100644 --- a/app/views/repositories/committers.rhtml +++ b/app/views/repositories/committers.rhtml @@ -15,11 +15,16 @@ +<% i = 0 -%> <% @committers.each do |committer, user_id| -%> <%=h committer %> - <%= select_tag "committers[#{committer}]", content_tag('option', "-- #{l :actionview_instancetag_blank_option} --", :value => '') + options_from_collection_for_select(@users, 'id', 'name', user_id.to_i) %> + + <%= hidden_field_tag "committers[#{i}][]", committer %> + <%= select_tag "committers[#{i}][]", content_tag('option', "-- #{l :actionview_instancetag_blank_option} --", :value => '') + options_from_collection_for_select(@users, 'id', 'name', user_id.to_i) %> + + <% i += 1 -%> <% end -%> diff --git a/test/functional/repositories_controller_test.rb b/test/functional/repositories_controller_test.rb index 4bb9c3fa3..972c57e00 100644 --- a/test/functional/repositories_controller_test.rb +++ b/test/functional/repositories_controller_test.rb @@ -73,12 +73,12 @@ class RepositoriesControllerTest < Test::Unit::TestCase assert_tag :td, :content => 'dlopper', :sibling => { :tag => 'td', - :child => { :tag => 'select', :attributes => { :name => 'committers[dlopper]' }, + :child => { :tag => 'select', :attributes => { :name => %r{^committers\[\d+\]\[\]$} }, :child => { :tag => 'option', :content => 'Dave Lopper', :attributes => { :value => '3', :selected => 'selected' }}}} assert_tag :td, :content => 'foo', :sibling => { :tag => 'td', - :child => { :tag => 'select', :attributes => { :name => 'committers[foo]' }}} + :child => { :tag => 'select', :attributes => { :name => %r{^committers\[\d+\]\[\]$} }}} assert_no_tag :td, :content => 'foo', :sibling => { :tag => 'td', :descendant => { :tag => 'option', :attributes => { :selected => 'selected' }}} @@ -90,7 +90,7 @@ class RepositoriesControllerTest < Test::Unit::TestCase c = Changeset.create!(:repository => Project.find(1).repository, :committer => 'foo', :committed_on => Time.now, :revision => 100, :comments => 'Committed by foo.') assert_no_difference "Changeset.count(:conditions => 'user_id = 3')" do - post :committers, :id => 1, :committers => { 'foo' => '2', 'dlopper' => '3'} + post :committers, :id => 1, :committers => { '0' => ['foo', '2'], '1' => ['dlopper', '3']} assert_redirected_to '/repositories/committers/ecookbook' assert_equal User.find(2), c.reload.user end