diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 12e9793ed2eea7a2b197f1075fb1d9086c7ad6d5..75440a51f64516ec8b509fc412ddfeffc6553f93 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -358,7 +358,7 @@ class UsersController < ApplicationController # Return the user websites that pass validation (only). def validated_profile_websites(profile_params) sites = profile_params[:user_websites_attributes] - + websites = sites.select { |_, v| v[:url].present? && v[:url] != ''} .transform_values { |w| w.merge({ url: ensure_protocol(w[:url]) }) } @@ -377,6 +377,17 @@ class UsersController < ApplicationController websites.reject { |_, w| w[:url].nil? } end + def cleaned_profile_websites(profile_params) + sites = profile_params[:user_websites_attributes] + + sites.transform_values do |w| + w.merge({ + label: w[:label].present? ? w[:label] : nil, + url: w[:url].present? ? w[:url] : nil + }) + end + end + # Ensure that a "naked" URL like example.com gets a protocol. def ensure_protocol(uri) # URI::Generic indicates the user didn't include a protocol @@ -397,10 +408,9 @@ class UsersController < ApplicationController :twitter, user_websites_attributes: [:id, :label, :url]) - # Ensure that all user-supplied URLs are valid (strip ones that aren't). -# if profile_params[:user_websites_attributes].present? -# profile_params[:user_websites_attributes] = validated_profile_websites(profile_params) -# end + if profile_params[:user_websites_attributes].present? + profile_params[:user_websites_attributes] = cleaned_profile_websites(profile_params) + end @user = current_user diff --git a/app/tasks/maintenance/initialize_user_websites_task.rb b/app/tasks/maintenance/initialize_user_websites_task.rb index 09bc77bddb71b25e1825cbd55459b59b27db246e..0a0b578ef61bd77a8218681ee09366563b19c17f 100644 --- a/app/tasks/maintenance/initialize_user_websites_task.rb +++ b/app/tasks/maintenance/initialize_user_websites_task.rb @@ -13,24 +13,23 @@ module Maintenance # This should be idempotent, as the same element may be processed more # than once if the task is interrupted and resumed. unless user.user_websites.where(user_id: user.id, position: 1).size.positive? - if user.website + if user.website.present? UserWebsite.create!(user_id: user.id, position: 1, label: 'website', url: user.website) else - # Need label for uniqueness constraint; won't show in UI without URL - UserWebsite.create!(user_id: user.id, position: 1, label: '1') + UserWebsite.create!(user_id: user.id, position: 1) end end unless user.user_websites.where(user_id: user.id, position: 2).size.positive? - if user.twitter + if user.twitter.present? UserWebsite.create!(user_id: user.id, position: 2, label: 'Twitter', url: "https://twitter.com/#{user.twitter}") else - UserWebsite.create!(user_id: user.id, position: 2, label: '2') + UserWebsite.create!(user_id: user.id, position: 2) end end # This check *should* be superfluous, but just in case... unless user.user_websites.where(user_id: user.id, position: 3).size.positive? - UserWebsite.create!(user_id: user.id, position: 3, label: '3') + UserWebsite.create!(user_id: user.id, position: 3) end end