diff options
author | Louise Crow <louise.crow@gmail.com> | 2015-01-20 12:26:30 +0000 |
---|---|---|
committer | Gareth Rees <gareth@mysociety.org> | 2015-02-03 16:24:01 +0000 |
commit | 7c7b008a0f2c6937b6bf02ab26134bb90aae19ee (patch) | |
tree | c8da153409eb58e4cbf6a00795b6322153cc4c03 | |
parent | 9f2db30774d159eb143497584de65f0d7a68ee40 (diff) |
Fix submission of form containing both existing and new translations
-rw-r--r-- | app/helpers/admin_public_body_helper.rb | 4 | ||||
-rw-r--r-- | app/models/public_body.rb | 4 | ||||
-rw-r--r-- | app/views/admin_public_body/_form.html.erb | 55 | ||||
-rw-r--r-- | app/views/admin_public_body/_locale_fields.html.erb | 49 | ||||
-rw-r--r-- | spec/controllers/admin_public_body_controller_spec.rb | 91 | ||||
-rw-r--r-- | spec/helpers/admin_public_body_helper_spec.rb | 4 | ||||
-rw-r--r-- | spec/integration/admin_public_body_edit_spec.rb | 12 | ||||
-rw-r--r-- | spec/models/public_body_spec.rb | 42 |
8 files changed, 140 insertions, 121 deletions
diff --git a/app/helpers/admin_public_body_helper.rb b/app/helpers/admin_public_body_helper.rb index 5139bd49f..97f656ddb 100644 --- a/app/helpers/admin_public_body_helper.rb +++ b/app/helpers/admin_public_body_helper.rb @@ -7,11 +7,11 @@ module AdminPublicBodyHelper object = public_body else # ...but additional locales go "on the side" - prefix = 'public_body[translated_versions][]' + prefix = :translations object = if public_body.new_record? PublicBody::Translation.new else - public_body.find_translation_by_locale(locale.to_s) + public_body.find_translation_by_locale(locale.to_s) end object ||= PublicBody::Translation.new end diff --git a/app/models/public_body.rb b/app/models/public_body.rb index a434cce35..d3544e13c 100644 --- a/app/models/public_body.rb +++ b/app/models/public_body.rb @@ -64,6 +64,7 @@ class PublicBody < ActiveRecord::Base } translates :name, :short_name, :request_email, :url_name, :notes, :first_letter, :publication_scheme + accepts_nested_attributes_for :translations # Default fields available for importing from CSV, in the format # [field_name, 'short description of field (basic html allowed)'] @@ -151,12 +152,11 @@ class PublicBody < ActiveRecord::Base translations end - def translated_versions=(translation_attrs) + def translations_attributes=(translation_attrs) def empty_translation?(attrs) attrs_with_values = attrs.select{ |key, value| value != '' and key.to_s != 'locale' } attrs_with_values.empty? end - if translation_attrs.respond_to? :each_value # Hash => updating translation_attrs.each_value do |attrs| next if empty_translation?(attrs) diff --git a/app/views/admin_public_body/_form.html.erb b/app/views/admin_public_body/_form.html.erb index 6b573ac9e..177873984 100644 --- a/app/views/admin_public_body/_form.html.erb +++ b/app/views/admin_public_body/_form.html.erb @@ -9,53 +9,22 @@ <% end %> </ul> <div class="tab-content"> -<% I18n.available_locales.each do |locale| %> - <% context = public_body_form_object(@public_body, locale) %> - - <%= fields_for context[:prefix], context[:object] do |t| %> - <div class="tab-pane" id="div-locale-<%=locale.to_s%>"> - <div class="control-group"> - <%= t.hidden_field :locale, :value => locale.to_s %> - <label for="<%= form_tag_id(t.object_name, :name, locale) %>" class="control-label">Name</label> - <div class="controls"> - <%= t.text_field :name, :id => form_tag_id(t.object_name, :name, locale), :class => "span4" %> - </div> - </div> - <div class="control-group"> - <label for="<%= form_tag_id(t.object_name, :short_name, locale) %>", class="control-label"><%=_("Short name")%></label> - <div class="controls"> - <%= t.text_field :short_name, :id => form_tag_id(t.object_name, :short_name, locale), :class => "span2" %> - <p class="help-block"><%=_("Only put in abbreviations which are really used, otherwise leave blank. Short or long name is used in the URL – don't worry about breaking URLs through renaming, as the history is used to redirect")%></p> - </div> - </div> - <div class="control-group"> - <label for="<%= form_tag_id(t.object_name, :request_email, locale) %>" class="control-label"><%=_("Request email")%></label> - <div class="controls"> - <%= t.text_field :request_email, :id => form_tag_id(t.object_name, :request_email, locale), :class => "span3" %> - <p class="help-block"><%=_("set to <strong>blank</strong> (empty string) if can't find an address; these emails are <strong>public</strong> as anyone can view with a CAPTCHA")%></p> - </div> - </div> - <div class="control-group"> - <label for="<%= form_tag_id(t.object_name, :publication_scheme, locale) %>" class="control-label"><%=_("Publication scheme URL")%></label> - <div class="controls"> - <%= t.text_field :publication_scheme, :size => 60, :id => form_tag_id(t.object_name, :publication_scheme, locale), :class => "span3" %> - </div> - </div> - <div class="control-group"> - <label for="<%= form_tag_id(t.object_name, :notes, locale) %>" class="control-label"><%=_("Public notes")%></label> - <div class="controls"> - <%= t.text_area :notes, :rows => 3, :id => form_tag_id(t.object_name, :notes, locale), :class => "span6" %> - <p class="help-block"> - HTML, for users to consider when making FOI requests to the authority - </p> - </div> - </div> - </div> + <% I18n.available_locales.each do |locale| %> + <% context = public_body_form_object(@public_body, locale) %> + <% if locale.to_s == I18n.default_locale.to_s %> + <%= fields_for('public_body', context[:object]) do |t| %> + <%= render :partial => 'locale_fields', :locals => {:t => t, :locale => locale}%> + <% end %> + <% else %> + <%= f.fields_for(context[:prefix], context[:object], :child_index => locale) do |t| %> + <%= render :partial => 'locale_fields' , :locals => {:t => t, :locale => locale}%> + <% end %> + <% end %> <% end %> -<% end %> </div> </div> + <h3>Common Fields</h3> <div class="control-group"> <label for="public_body_tag_string" class="control-label"><%=_("Tags")%></label> diff --git a/app/views/admin_public_body/_locale_fields.html.erb b/app/views/admin_public_body/_locale_fields.html.erb new file mode 100644 index 000000000..cbe008fe2 --- /dev/null +++ b/app/views/admin_public_body/_locale_fields.html.erb @@ -0,0 +1,49 @@ + +<div class="tab-pane" id="div-locale-<%=locale.to_s%>"> + <div class="control-group"> + <%= t.hidden_field :locale, :value => locale.to_s %> + <label for="<%= form_tag_id(t.object_name, :name, locale) %>" class="control-label">Name</label> + <div class="controls"> + <%= t.text_field :name, :id => form_tag_id(t.object_name, :name, locale), :class => "span4" %> + </div> + </div> + + <div class="control-group"> + <label for="<%= form_tag_id(t.object_name, :short_name, locale) %>" class="control-label"><%=_("Short name")%></label> + <div class="controls"> + <%= t.text_field :short_name, :id => form_tag_id(t.object_name, :short_name, locale), :class => "span2" %> + <p class="help-block"> + <%=_("Only put in abbreviations which are really used, otherwise leave blank. Short or long name is used in the URL – don't worry about breaking URLs through renaming, as the history is used to redirect")%> + </p> + </div> + </div> + + <div class="control-group"> + <label for="<%= form_tag_id(t.object_name, :request_email, locale) %>" class="control-label"><%=_("Request email")%></label> + <div class="controls"> + <%= t.text_field :request_email, :id => form_tag_id(t.object_name, :request_email, locale), :class => "span3" %> + <p class="help-block"> + <%=_("set to <strong>blank</strong> (empty string) if can't find an address; these emails are <strong>public</strong> as anyone can view with a CAPTCHA")%> + </p> + </div> + </div> + + <div class="control-group"> + <label for="<%= form_tag_id(t.object_name, :publication_scheme, locale) %>" class="control-label"><%=_("Publication scheme URL")%></label> + <div class="controls"> + <%= t.text_field :publication_scheme, :size => 60, :id => form_tag_id(t.object_name, :publication_scheme, locale), :class => "span3" %> + </div> + </div> + + <div class="control-group"> + <label for="<%= form_tag_id(t.object_name, :notes, locale) %>" class="control-label"><%=_("Public notes")%></label> + <div class="controls"> + <%= t.text_area :notes, :rows => 3, :id => form_tag_id(t.object_name, :notes, locale), :class => "span6" %> + <p class="help-block"> + HTML, for users to consider when making FOI requests to the authority + </p> + </div> + </div> + +</div> + diff --git a/spec/controllers/admin_public_body_controller_spec.rb b/spec/controllers/admin_public_body_controller_spec.rb index 8aebbc9ed..5b8ed6c55 100644 --- a/spec/controllers/admin_public_body_controller_spec.rb +++ b/spec/controllers/admin_public_body_controller_spec.rb @@ -88,11 +88,13 @@ describe AdminPublicBodyController, "when creating a public body" do :tag_string => "blah", :request_email => 'newquango@localhost', :last_edit_comment => 'From test code', - :translated_versions => [{ :locale => "es", - :name => "Mi Nuevo Quango", - :short_name => "", - :request_email => 'newquango@localhost' }] - } + :translations_attributes => { + 'es' => { :locale => "es", + :name => "Mi Nuevo Quango", + :short_name => "", + :request_email => 'newquango@localhost' } + } + } } PublicBody.count.should == n + 1 @@ -209,17 +211,19 @@ describe AdminPublicBodyController, "when updating a public body" do :tag_string => "some tags", :request_email => 'edited@localhost', :last_edit_comment => 'From test code', - :translations_attributes => [ - { :locale => "es", - :name => "El Department for Humpadinking", - :short_name => "", - :request_email => 'edited@localhost' } - ] + :translations_attributes => { + 'es' => { :locale => "es", + :name => "El Department for Humpadinking", + :short_name => "", + :request_email => 'edited@localhost' } + } } } request.flash[:notice].should include('successful') + pb = PublicBody.find(public_bodies(:humpadink_public_body).id) + I18n.with_locale(:es) do expect(pb.name).to eq('El Department for Humpadinking') end @@ -238,21 +242,23 @@ describe AdminPublicBodyController, "when updating a public body" do :tag_string => "some tags", :request_email => 'edited@localhost', :last_edit_comment => 'From test code', - :translations_attributes => [ - { :locale => "es", - :name => "El Department for Humpadinking", - :short_name => "", - :request_email => 'edited@localhost' }, - { :locale => "fr", - :name => "Le Department for Humpadinking", - :short_name => "", - :request_email => 'edited@localhost' } - ] + :translations_attributes => { + 'es' => { :locale => "es", + :name => "El Department for Humpadinking", + :short_name => "", + :request_email => 'edited@localhost' }, + 'fr' => { :locale => "fr", + :name => "Le Department for Humpadinking", + :short_name => "", + :request_email => 'edited@localhost' } + } } } request.flash[:notice].should include('successful') + pb = PublicBody.find(public_bodies(:humpadink_public_body).id) + I18n.with_locale(:es) do expect(pb.name).to eq('El Department for Humpadinking') end @@ -265,7 +271,7 @@ describe AdminPublicBodyController, "when updating a public body" do it 'updates an existing translation and adds a third translation' do pb = public_bodies(:humpadink_public_body) - post :update, { + put :update, { :id => pb.id, :public_body => { :name => "Department for Humpadinking", @@ -273,25 +279,25 @@ describe AdminPublicBodyController, "when updating a public body" do :tag_string => "some tags", :request_email => 'edited@localhost', :last_edit_comment => 'From test code', - :translations_attributes => [ + :translations_attributes => { # Update existing translation - { :locale => "es", - :name => "Renamed Department for Humpadinking", - :short_name => "", - :request_email => 'edited@localhost' }, + 'es' => { :locale => "es", + :name => "Renamed Department for Humpadinking", + :short_name => "", + :request_email => 'edited@localhost' }, # Add new translation - { :locale => "fr", - :name => "Le Department for Humpadinking", - :short_name => "", - :request_email => 'edited@localhost' } - ] + 'fr' => { :locale => "fr", + :name => "Le Department for Humpadinking", + :short_name => "", + :request_email => 'edited@localhost' } + } } } - pb.reload - request.flash[:notice].should include('successful') + pb = PublicBody.find(public_bodies(:humpadink_public_body).id) + I18n.with_locale(:es) do expect(pb.name).to eq('Renamed Department for Humpadinking') end @@ -299,6 +305,7 @@ describe AdminPublicBodyController, "when updating a public body" do I18n.with_locale(:fr) do expect(pb.name).to eq('Le Department for Humpadinking') end + end it "saves edits to a public body in another locale" do @@ -313,11 +320,11 @@ describe AdminPublicBodyController, "when updating a public body" do :tag_string => "some tags", :request_email => 'edited@localhost', :last_edit_comment => 'From test code', - :translated_versions => { - 3 => {:locale => "es", - :name => "Renamed", - :short_name => "", - :request_email => 'edited@localhost'} + :translations_attributes => { + 'es' => { :locale => "es", + :name => "Renamed", + :short_name => "", + :request_email => 'edited@localhost' } } } } @@ -325,11 +332,13 @@ describe AdminPublicBodyController, "when updating a public body" do end pb = PublicBody.find(public_bodies(:humpadink_public_body).id) + I18n.with_locale(:es) do - pb.name.should == "Renamed" + expect(pb.name).to eq('Renamed') end + I18n.with_locale(:en) do - pb.name.should == "Department for Humpadinking" + expect(pb.name).to eq('Department for Humpadinking') end end diff --git a/spec/helpers/admin_public_body_helper_spec.rb b/spec/helpers/admin_public_body_helper_spec.rb index defb1b359..c135ef348 100644 --- a/spec/helpers/admin_public_body_helper_spec.rb +++ b/spec/helpers/admin_public_body_helper_spec.rb @@ -27,11 +27,11 @@ describe AdminPublicBodyHelper do context 'in an alternative locale' do - it 'provides the prefix public_body[translated_versions][]' do + it 'provides the prefix :translations' do public_body = FactoryGirl.build(:public_body) locale = :es prefix = public_body_form_object(public_body, locale)[:prefix] - expect(prefix).to eq('public_body[translated_versions][]') + expect(prefix).to eq(:translations) end context 'when the PublicBody is new' do diff --git a/spec/integration/admin_public_body_edit_spec.rb b/spec/integration/admin_public_body_edit_spec.rb index 83174fa80..d75ded6fe 100644 --- a/spec/integration/admin_public_body_edit_spec.rb +++ b/spec/integration/admin_public_body_edit_spec.rb @@ -19,9 +19,9 @@ describe 'Editing a Public Body' do it 'can add a translation for a single locale' do expect(@body.find_translation_by_locale('fr')).to be_nil - + @admin.visit admin_body_edit_path(@body) - @admin.fill_in 'public_body_translated_versions__name__fr', :with => 'New Quango FR' + @admin.fill_in 'public_body_translations_attributes_fr_name__fr', :with => 'New Quango FR' @admin.click_button 'Save' pb = PublicBody.find_by_name('New Quango') @@ -30,17 +30,17 @@ describe 'Editing a Public Body' do end end - it 'can add a translation for multiple locales' do + it 'can add a translation for multiple locales', :focus => true do # Add FR translation expect(@body.find_translation_by_locale('fr')).to be_nil @admin.visit admin_body_edit_path(@body) - @admin.fill_in 'public_body_translated_versions__name__fr', :with => 'New Quango FR' + @admin.fill_in 'public_body_translations_attributes_fr_name__fr', :with => 'New Quango FR' @admin.click_button 'Save' # Add ES translation expect(@body.find_translation_by_locale('es')).to be_nil - @admin.visit admin_body_edit_path(@body) - @admin.fill_in 'public_body_translated_versions__name__es', :with => 'New Quango ES' + @admin.visit admin_body_edit_path(@body) + @admin.fill_in 'public_body_translations_attributes_es_name__es', :with => 'New Quango ES' @admin.click_button 'Save' pb = PublicBody.find_by_name('New Quango') diff --git a/spec/models/public_body_spec.rb b/spec/models/public_body_spec.rb index bdfaab6bf..f12582f21 100644 --- a/spec/models/public_body_spec.rb +++ b/spec/models/public_body_spec.rb @@ -30,23 +30,23 @@ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe PublicBody do - describe :translated_versions= do + describe :translations_attributes= do context 'translation_attrs is a Hash' do it 'takes the correct code path for a Hash' do attrs = {} attrs.should_receive(:each_value) - PublicBody.new().translated_versions = attrs + PublicBody.new().translations_attributes = attrs end it 'updates an existing translation' do body = public_bodies(:geraldine_public_body) translation = body.translation_for(:es) - params = { translation.id.to_sym => { :locale => 'es', - :name => 'Renamed' } } + params = { 'es' => { :locale => 'es', + :name => 'Renamed' } } - body.translated_versions = params + body.translations_attributes = params I18n.with_locale(:es) { expect(body.name).to eq('Renamed') } end @@ -56,15 +56,11 @@ describe PublicBody do expect(body.translations.size).to eq(2) - body.translated_versions = { - translation.id.to_sym => { - :locale => 'es', - :name => 'Renamed' - }, - :new_translation => { - :locale => 'fr', - :name => 'Le Geraldine Quango' - } + body.translations_attributes = { + 'es' => { :locale => 'es', + :name => 'Renamed' }, + 'fr' => { :locale => 'fr', + :name => 'Le Geraldine Quango' } } expect(body.translations.size).to eq(3) @@ -78,14 +74,10 @@ describe PublicBody do expect(body.translations.size).to eq(2) - body.translated_versions = { - translation.id.to_sym => { - :locale => 'es', - :name => 'Renamed' - }, - :empty_translation => { - :locale => 'es' - } + body.translations_attributes = { + 'es' => { :locale => 'es', + :name => 'Renamed' }, + 'fr' => { :locale => 'fr' } } expect(body.translations.size).to eq(2) @@ -98,7 +90,7 @@ describe PublicBody do it 'takes the correct code path for an Array' do attrs = [] attrs.should_receive(:each) - PublicBody.new().translated_versions = attrs + PublicBody.new().translations_attributes = attrs end it 'creates a new translation' do @@ -108,7 +100,7 @@ describe PublicBody do expect(body.translations.size).to eq(1) - body.translated_versions = [ { + body.translations_attributes = [ { :locale => 'es', :name => 'Renamed' } @@ -125,7 +117,7 @@ describe PublicBody do expect(body.translations.size).to eq(1) - body.translated_versions = [ + body.translations_attributes = [ { :locale => 'empty' } ] |