Use nested attributes for updating multiple variables

This commit is contained in:
Matija Čupić 2018-01-23 01:17:40 +01:00
parent ba07784192
commit 5de85708ce
No known key found for this signature in database
GPG Key ID: 4BAF84FFACD2E5DE
2 changed files with 9 additions and 26 deletions

View File

@ -1,6 +1,5 @@
class Projects::VariablesController < Projects::ApplicationController
before_action :variable, only: [:show, :update, :destroy]
before_action :variables, only: [:save_multiple]
before_action :authorize_admin_build!
layout 'project_settings'
@ -36,11 +35,9 @@ class Projects::VariablesController < Projects::ApplicationController
def save_multiple
respond_to do |format|
format.json do
return head :bad_request unless @variables.all?(&:valid?)
return head :ok if @project.update(variables_params)
@variables.each(&:save)
@variables_destroy.each(&:destroy)
head :ok
head :bad_request
end
end
end
@ -64,7 +61,7 @@ class Projects::VariablesController < Projects::ApplicationController
end
def variables_params
params.permit(variables: [*variable_params_attributes])
params.permit(variables_attributes: [*variable_params_attributes])
end
def variable_params_attributes
@ -74,19 +71,4 @@ class Projects::VariablesController < Projects::ApplicationController
def variable
@variable ||= project.variables.find(params[:id]).present(current_user: current_user)
end
def variables
destroy, edit = variables_params[:variables].partition { |hash| hash[:_destroy] == 'true' }
@variables = initialize_or_update_variables_from_hash(edit)
@variables_destroy = initialize_or_update_variables_from_hash(destroy)
end
def initialize_or_update_variables_from_hash(hash)
hash.map do |variable_hash|
variable = project.variables.where(key: variable_hash[:key])
.first_or_initialize(variable_hash).present(current_user: current_user)
variable.assign_attributes(variable_hash.except(:_destroy)) unless variable.new_record?
variable
end
end
end

View File

@ -67,8 +67,8 @@ describe Projects::VariablesController do
subject do
post :save_multiple,
namespace_id: project.namespace.to_param, project_id: project,
variables: [{ key: variable.key, value: 'other_value' },
{ key: '..?', value: 'dummy_value' }],
variables_attributes: [{ id: variable.id, key: variable.key, value: 'other_value' },
{ key: '..?', value: 'dummy_value' }],
format: :json
end
@ -91,8 +91,8 @@ describe Projects::VariablesController do
subject do
post :save_multiple,
namespace_id: project.namespace.to_param, project_id: project,
variables: [{ key: variable.key, value: 'other_value' },
{ key: 'new_key', value: 'dummy_value' }],
variables_attributes: [{ id: variable.id, key: variable.key, value: 'other_value' },
{ key: 'new_key', value: 'dummy_value' }],
format: :json
end
@ -115,7 +115,8 @@ describe Projects::VariablesController do
subject do
post :save_multiple,
namespace_id: project.namespace.to_param, project_id: project,
variables: [{ key: variable.key, value: variable.value, _destroy: 'true' }],
variables_attributes: [{ id: variable.id, key: variable.key,
value: variable.value, _destroy: 'true' }],
format: :json
end