diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index aeea361ba1..7ae785e33f 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -14,6 +14,8 @@ class ApplicationController < ActionController::Base around_action :use_logidze_responsible, only: %i[create destroy update transfer] # rubocop:disable Rails/LexicallyScopedActionFilter around_action :switch_locale + helper_method :error_message + def set_current_user Current.user = current_user yield @@ -65,4 +67,8 @@ def route_not_found def pipelines_enabled? @pipelines_enabled = Irida::Pipelines.instance.available_pipelines.any? end + + def error_message(object) + object.errors.full_messages.to_sentence + end end diff --git a/app/controllers/concerns/attachment_actions.rb b/app/controllers/concerns/attachment_actions.rb index b236c9de9b..4492cad069 100644 --- a/app/controllers/concerns/attachment_actions.rb +++ b/app/controllers/concerns/attachment_actions.rb @@ -78,7 +78,7 @@ def destroy # rubocop:disable Metrics/MethodLength render status: :unprocessable_entity, locals: { message: t('.error', filename: @attachment.file.filename, - errors: @attachment.errors.full_messages.first), + errors: error_message(@attachment)), destroyed_attachments: nil } end end diff --git a/app/controllers/concerns/bot_actions.rb b/app/controllers/concerns/bot_actions.rb index fced0d5f77..8e2fa8b18b 100644 --- a/app/controllers/concerns/bot_actions.rb +++ b/app/controllers/concerns/bot_actions.rb @@ -45,7 +45,7 @@ def create # rubocop:disable Metrics/MethodLength render status: :unprocessable_entity, locals: { type: 'alert', - message: @new_bot_account[:bot_user_account].errors.full_messages.first, + message: error_message(@new_bot_account[:bot_user_account]), bot_params: } end @@ -74,7 +74,7 @@ def destroy render status: :unprocessable_entity, locals: { type: 'alert', - message: @bot_account.errors.full_messages.first + message: error_message(@bot_account) } end end diff --git a/app/controllers/concerns/bot_personal_access_token_actions.rb b/app/controllers/concerns/bot_personal_access_token_actions.rb index 1104ca5806..1cbec58f82 100644 --- a/app/controllers/concerns/bot_personal_access_token_actions.rb +++ b/app/controllers/concerns/bot_personal_access_token_actions.rb @@ -47,7 +47,7 @@ def create # rubocop:disable Metrics/MethodLength render status: :unprocessable_entity, locals: { type: 'alert', - message: @personal_access_token.errors.full_messages.first } + message: error_message(@personal_access_token) } end end @@ -75,7 +75,7 @@ def revoke } else render status: :unprocessable_entity, locals: { type: 'alert', - message: @personal_access_token.errors.full_messages.first } + message: error_message(@personal_access_token) } end end end diff --git a/app/controllers/concerns/membership_actions.rb b/app/controllers/concerns/membership_actions.rb index 0e07f29f86..921ef14703 100644 --- a/app/controllers/concerns/membership_actions.rb +++ b/app/controllers/concerns/membership_actions.rb @@ -50,7 +50,7 @@ def create # rubocop:disable Metrics/MethodLength respond_to do |format| format.turbo_stream do render status: :unprocessable_entity, locals: { member: @new_member, type: 'alert', - message: @new_member.errors.full_messages.first } + message: error_message(@new_member) } end end end @@ -81,7 +81,7 @@ def destroy # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/Per I18n.t('activerecord.errors.models.member.destroy.last_member_self', namespace_type: @namespace.class.model_name.human) else - @member.errors.full_messages.first + error_message(@member) end respond_to do |format| @@ -106,7 +106,7 @@ def update # rubocop:disable Metrics/MethodLength format.turbo_stream do render status: :bad_request, locals: { member: @member, type: 'alert', - message: @member.errors.full_messages.first } + message: error_message(@member) } end end end diff --git a/app/controllers/concerns/share_actions.rb b/app/controllers/concerns/share_actions.rb index 1dd2b03e26..7f39753800 100644 --- a/app/controllers/concerns/share_actions.rb +++ b/app/controllers/concerns/share_actions.rb @@ -50,13 +50,13 @@ def create # rubocop:disable Metrics/MethodLength, Metrics/AbcSize render status: :unprocessable_entity, locals: { namespace_group_link: @created_namespace_group_link, type: 'alert', - message: @created_namespace_group_link.errors.full_messages.first } + message: error_message(@created_namespace_group_link) } end end end end - def destroy # rubocop:disable Metrics/MethodLength, Metrics/AbcSize + def destroy # rubocop:disable Metrics/MethodLength GroupLinks::GroupUnlinkService.new(current_user, @namespace_group_link).execute @pagy, @namespace_group_links = pagy(load_namespace_group_links) @@ -73,7 +73,7 @@ def destroy # rubocop:disable Metrics/MethodLength, Metrics/AbcSize format.turbo_stream do render status: :unprocessable_entity, locals: { namespace_group_link: @namespace_group_link, type: 'alert', - message: @namespace_group_link.errors.full_messages.first } + message: error_message(@namespace_group_link) } end end else diff --git a/app/controllers/data_exports_controller.rb b/app/controllers/data_exports_controller.rb index e0ee4b6009..1e22ea86c5 100644 --- a/app/controllers/data_exports_controller.rb +++ b/app/controllers/data_exports_controller.rb @@ -42,14 +42,14 @@ def new end end - def create # rubocop:disable Metrics/AbcSize + def create @data_export = DataExports::CreateService.new(current_user, data_export_params).execute if @data_export.errors.any? respond_to do |format| format.turbo_stream do render status: :unprocessable_entity, - locals: { type: 'alert', message: @data_export.errors.full_messages.first, + locals: { type: 'alert', message: error_message(@data_export), export_type: data_export_params['export_type'] } end end diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index c30327590c..70c5259194 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -89,7 +89,7 @@ def destroy flash[:success] = t('.success', group_name: @group.name) redirect_to dashboard_groups_path(format: :html) else - flash[:error] = @group.errors.full_messages.first + flash[:error] = error_message(@group) redirect_to group_path(@group) end end diff --git a/app/controllers/profiles/personal_access_tokens_controller.rb b/app/controllers/profiles/personal_access_tokens_controller.rb index ec307791ad..d93211cb8f 100644 --- a/app/controllers/profiles/personal_access_tokens_controller.rb +++ b/app/controllers/profiles/personal_access_tokens_controller.rb @@ -25,7 +25,7 @@ def create # rubocop:disable Metrics/MethodLength format.turbo_stream do render status: :unprocessable_entity, locals: { personal_access_token: @personal_access_token, new_personal_access_token: nil, - message: @personal_access_token.errors.full_messages.first } + message: error_message(@personal_access_token) } end end end diff --git a/app/controllers/projects/samples/attachments/concatenations_controller.rb b/app/controllers/projects/samples/attachments/concatenations_controller.rb index a84bef9ff2..a37afb108f 100644 --- a/app/controllers/projects/samples/attachments/concatenations_controller.rb +++ b/app/controllers/projects/samples/attachments/concatenations_controller.rb @@ -25,7 +25,7 @@ def create if @sample.errors.empty? render status: :ok, locals: { type: :success, message: t('.success') } else - @errors = @sample.errors.full_messages.first + @errors = error_message(@sample) render status: :unprocessable_entity, locals: { type: :danger, message: @errors } end diff --git a/app/controllers/projects/samples/attachments_controller.rb b/app/controllers/projects/samples/attachments_controller.rb index 8b1d7fbfaa..379de30a44 100644 --- a/app/controllers/projects/samples/attachments_controller.rb +++ b/app/controllers/projects/samples/attachments_controller.rb @@ -63,7 +63,7 @@ def destroy # rubocop:disable Metrics/MethodLength render status: :unprocessable_entity, locals: { message: t('.error', filename: @attachment.file.filename, - errors: @attachment.errors.full_messages.first), + errors: error_message(@attachment)), destroyed_attachments: nil } end end diff --git a/app/controllers/projects/samples/deletions_controller.rb b/app/controllers/projects/samples/deletions_controller.rb index 627f6e39ce..d123b652a0 100644 --- a/app/controllers/projects/samples/deletions_controller.rb +++ b/app/controllers/projects/samples/deletions_controller.rb @@ -28,7 +28,7 @@ def destroy else format.turbo_stream do render status: :unprocessable_entity, - locals: { type: 'alert', message: @sample.errors.full_messages.first } + locals: { type: 'alert', message: error_message(@sample) } end end end diff --git a/app/controllers/projects/samples/metadata/deletions_controller.rb b/app/controllers/projects/samples/metadata/deletions_controller.rb index 78340d5ff9..0cfb0cd8cc 100644 --- a/app/controllers/projects/samples/metadata/deletions_controller.rb +++ b/app/controllers/projects/samples/metadata/deletions_controller.rb @@ -54,7 +54,7 @@ def get_destroy_messages(deleted_keys) message: t('projects.samples.metadata.deletions.destroy.multi_success', deleted_keys: deleted_keys.join(', ')) } end - messages << { type: 'error', message: @sample.errors.full_messages.first } if @sample.errors.any? + messages << { type: 'error', message: error_message(@sample) } if @sample.errors.any? messages end end diff --git a/app/controllers/projects/samples/metadata/fields_controller.rb b/app/controllers/projects/samples/metadata/fields_controller.rb index 81dcd376d6..33aa27cb44 100644 --- a/app/controllers/projects/samples/metadata/fields_controller.rb +++ b/app/controllers/projects/samples/metadata/fields_controller.rb @@ -16,7 +16,7 @@ def create create_field_params['create_fields']).execute if @sample.errors.any? - render status: :unprocessable_entity, locals: { type: 'error', message: @sample.errors.full_messages.first } + render status: :unprocessable_entity, locals: { type: 'error', message: error_message(@sample) } else status = get_create_status(create_metadata_fields[:added_keys], create_metadata_fields[:existing_keys]) messages = get_create_messages(create_metadata_fields[:added_keys], create_metadata_fields[:existing_keys]) @@ -95,7 +95,7 @@ def get_update_status_and_message(updated_metadata_field) { type: 'success', message: t('projects.samples.metadata.fields.update.success') } else update_render_params[:status] = :unprocessable_entity - update_render_params[:message] = { type: 'error', message: @sample.errors.full_messages.first } + update_render_params[:message] = { type: 'error', message: error_message(@sample) } end update_render_params end diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 30d7874a77..d00e8d1fdf 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -98,7 +98,7 @@ def destroy flash[:success] = t('.success', project_name: @project.name) redirect_to dashboard_projects_path(format: :html) else - flash[:error] = @project.errors.full_messages.first + flash[:error] = error_message(@project) redirect_to project_path(@project) end end diff --git a/app/views/projects/samples/attachments/deletions/destroy.turbo_stream.erb b/app/views/projects/samples/attachments/deletions/destroy.turbo_stream.erb index 5524c4b550..da614789b8 100644 --- a/app/views/projects/samples/attachments/deletions/destroy.turbo_stream.erb +++ b/app/views/projects/samples/attachments/deletions/destroy.turbo_stream.erb @@ -15,8 +15,8 @@ t( ".error", filename: attachment.file.filename, - errors: attachment.errors.full_messages.first - ) + errors: error_message(attachment), + ), ) %> <% end %> <% end %> @@ -26,6 +26,6 @@ "table-listing", partial: "projects/samples/attachments/table", locals: { - attachments: @sample.attachments - } + attachments: @sample.attachments, + }, ) %> diff --git a/app/views/projects/samples/metadata/destroy.turbo_stream.erb b/app/views/projects/samples/metadata/destroy.turbo_stream.erb index ed4e6729a3..8688b940b4 100644 --- a/app/views/projects/samples/metadata/destroy.turbo_stream.erb +++ b/app/views/projects/samples/metadata/destroy.turbo_stream.erb @@ -2,8 +2,8 @@ <%= turbo_stream.update "update-alert", viral_alert( type: "alert", - message: @sample.errors.full_messages.first, - classes: "mb-4" + message: error_message(@sample), + classes: "mb-4", ) %> <% else %> <%= turbo_stream.append "flashes" do %> @@ -13,7 +13,7 @@ <%= turbo_stream.update "table-listing" do %> <% render partial: "projects/samples/metadata/table", locals: { - sample_metadata: @sample.metadata_with_provenance + sample_metadata: @sample.metadata_with_provenance, } %> <% end %> <% end %> diff --git a/app/views/projects/samples/metadata/fields/update.turbo_stream.erb b/app/views/projects/samples/metadata/fields/update.turbo_stream.erb index 8699cd77d3..51c287594d 100644 --- a/app/views/projects/samples/metadata/fields/update.turbo_stream.erb +++ b/app/views/projects/samples/metadata/fields/update.turbo_stream.erb @@ -4,16 +4,16 @@ locals: { open: @sample.errors.any?, key: defined?(key) ? key : nil, - value: defined?(value) ? value : nil - } + value: defined?(value) ? value : nil, + }, ) %> <% if @sample.errors.any? %> <%= turbo_stream.update "update-alert", viral_alert( type: "alert", - message: @sample.errors.full_messages.first, - classes: "mb-4" + message: error_message(@sample), + classes: "mb-4", ) %> <% else %> <%= turbo_stream.append "flashes" do %> @@ -23,7 +23,7 @@ <%= turbo_stream.update "table-listing" do %> <% render partial: "projects/samples/metadata/table", locals: { - sample_metadata: @sample.metadata_with_provenance + sample_metadata: @sample.metadata_with_provenance, } %> <% end %> <% end %> diff --git a/test/models/user_test.rb b/test/models/user_test.rb index b1e95345f1..165de7df79 100644 --- a/test/models/user_test.rb +++ b/test/models/user_test.rb @@ -91,7 +91,7 @@ def setup current_password: 'password1' } assert_not @user.update_password_with_password(params) - assert_equal "Password confirmation doesn't match Password", @user.errors.full_messages.first + assert_equal "Password confirmation doesn't match Password", @user.errors.full_messages.to_sentence end test 'unable to update password with blank password' do @@ -99,7 +99,7 @@ def setup current_password: 'password1' } assert_not @user.update_password_with_password(params) - assert_equal "Password can't be blank", @user.errors.full_messages.first + assert_equal "Password can't be blank", @user.errors.full_messages.to_sentence end test 'unable to update password with wrong password' do @@ -107,7 +107,7 @@ def setup current_password: 'wrong_password' } assert_not @user.update_password_with_password(params) - assert_equal 'Current password is invalid', @user.errors.full_messages.first + assert_equal 'Current password is invalid', @user.errors.full_messages.to_sentence end test 'full_name should combine the users first and last names' do diff --git a/test/services/data_exports/create_service_test.rb b/test/services/data_exports/create_service_test.rb index 7045a85aeb..6096910f32 100644 --- a/test/services/data_exports/create_service_test.rb +++ b/test/services/data_exports/create_service_test.rb @@ -49,7 +49,7 @@ def setup assert_no_difference -> { DataExport.count } do data_export = DataExports::CreateService.new(@user, invalid_params).execute assert_equal I18n.t('services.data_exports.create.invalid_export_samples'), - data_export.errors.full_messages.first + data_export.errors.full_messages.to_sentence end end @@ -63,7 +63,7 @@ def setup assert_no_difference -> { DataExport.count } do data_export = DataExports::CreateService.new(@user, invalid_params).execute assert_equal I18n.t('services.data_exports.create.invalid_export_samples'), - data_export.errors.full_messages.first + data_export.errors.full_messages.to_sentence end end @@ -117,7 +117,7 @@ def setup assert_no_difference -> { DataExport.count } do data_export = DataExports::CreateService.new(@user, invalid_params).execute assert_equal I18n.t('services.data_exports.create.invalid_export_workflow_executions'), - data_export.errors.full_messages.first + data_export.errors.full_messages.to_sentence end end @@ -218,7 +218,7 @@ def setup assert_no_difference -> { DataExport.count } do data_export = DataExports::CreateService.new(user, valid_params).execute assert_equal I18n.t('services.data_exports.create.invalid_export_workflow_executions'), - data_export.errors.full_messages.first + data_export.errors.full_messages.to_sentence end end @@ -273,7 +273,7 @@ def setup assert_no_difference -> { DataExport.count } do data_export = DataExports::CreateService.new(user, invalid_params).execute assert_equal I18n.t('services.data_exports.create.invalid_export_samples'), - data_export.errors.full_messages.first + data_export.errors.full_messages.to_sentence end end @@ -293,7 +293,7 @@ def setup assert_no_difference -> { DataExport.count } do data_export = DataExports::CreateService.new(user, invalid_params).execute assert_equal I18n.t('services.data_exports.create.invalid_export_samples'), - data_export.errors.full_messages.first + data_export.errors.full_messages.to_sentence end end @@ -498,7 +498,7 @@ def setup assert_no_difference -> { DataExport.count } do data_export = DataExports::CreateService.new(@user, params).execute assert_equal I18n.t('services.data_exports.create.invalid_export_workflow_executions'), - data_export.errors.full_messages.first + data_export.errors.full_messages.to_sentence end end @@ -511,7 +511,7 @@ def setup assert_no_difference -> { DataExport.count } do data_export = DataExports::CreateService.new(@user, params).execute assert_equal I18n.t('services.data_exports.create.invalid_export_workflow_executions'), - data_export.errors.full_messages.first + data_export.errors.full_messages.to_sentence end end @@ -524,7 +524,7 @@ def setup assert_no_difference -> { DataExport.count } do data_export = DataExports::CreateService.new(@user, params).execute assert_equal I18n.t('services.data_exports.create.non_completed_workflow_executions'), - data_export.errors.full_messages.first + data_export.errors.full_messages.to_sentence end end @@ -538,7 +538,7 @@ def setup assert_no_difference -> { DataExport.count } do data_export = DataExports::CreateService.new(@user, params).execute assert_equal I18n.t('services.data_exports.create.non_completed_workflow_executions'), - data_export.errors.full_messages.first + data_export.errors.full_messages.to_sentence end end end