use state machine from controller and handle exception

This commit is contained in:
Reinier Balt 2013-03-02 14:52:03 +01:00
parent 004339a2ca
commit 2719cb87c7
3 changed files with 54 additions and 33 deletions

View file

@ -91,47 +91,30 @@ class ContextsController < ApplicationController
# Edit the details of the context
#
def update
params['context'] ||= {}
success_text = if params['field'] == 'name' && params['value']
params['context']['id'] = params['id']
params['context']['name'] = params['value']
end
process_params_for_update
@original_context_state = @context.state
@context.attributes = params["context"]
@saved = @context.save
@state_saved = set_state_for_update(@new_state)
@saved = @saved && @state_saved
if @saved
if boolean_param('wants_render')
@state_changed = (@original_context_state != @context.state)
@new_state = @context.state if @state_changed
@active_contexts = current_user.contexts.active
@hidden_contexts = current_user.contexts.hidden
@closed_contexts = current_user.contexts.closed
respond_to do |format|
format.js
end
@state_changed = (@original_context_state != @context.state)
@new_state = @context.state if @state_changed
@active_contexts = current_user.contexts.active
@hidden_contexts = current_user.contexts.hidden
@closed_contexts = current_user.contexts.closed
end
# TODO is this param ever used? is this dead code?
elsif boolean_param('update_context_name')
@contexts = current_user.projects
render :template => 'contexts/update_context_name.js.rjs'
return
else
render :text => success_text || 'Success'
end
else
respond_to do |format|
format.js
format.xml {
respond_to do |format|
format.js
format.xml {
if @saved
render :xml => @context.to_xml( :except => :user_id )
else
render :text => "Error on update: #{@context.errors.full_messages.inject("") {|v, e| v + e + " " }}", :status => 409
end
}
end
end
end
@ -269,4 +252,34 @@ class ContextsController < ApplicationController
init_data_for_sidebar
end
def process_params_for_update
params['context'] ||= {}
@success_text = if params['field'] == 'name' && params['value']
params['context']['id'] = params['id']
params['context']['name'] = params['value']
end
@original_context_state = @context.state
@new_state = params['context']['state']
params['context'].delete('state')
end
def set_state_for_update(new_state)
begin
unless @original_context_state == new_state
if new_state == 'active'
@context.activate!
elsif new_state == 'hidden'
@context.hide!
elsif new_state == 'closed'
@context.close!
end
end
return true
rescue AASM::InvalidTransition
@context.errors.add(:state, "cannot be changed. The context cannot be closed if you have uncompleted actions in this context")
return false
end
end
end

View file

@ -15,9 +15,8 @@
<label for="context_hide"><%= t 'contexts.context_state' %> </label><br/>
<% ['active', 'hidden', 'closed'].each do | state | %>
<%= radio_button(:context, 'state', state, {:tabindex => next_tab_index}) %> <%= state.titlecase %>
<% end %>
<input type="hidden" name="wants_render" value="true" />
<% end %>
</br></br>
<div class="submit_box">
<div class="widgets">

View file

@ -31,7 +31,16 @@ class ContextsControllerTest < ActionController::TestCase
assert_ajax_create_increments_count '@newcontext'
end
# text feed
def test_update_handles_invalid_state_change
login_as :admin_user
context = users(:admin_user).contexts.first
xhr :put, :update, :id => context.id, :context => {:name => "@name", :state => 'closed'}
assert_response 200
assert /The context cannot be closed if you have uncompleted actions/.match(@response.body)
end
# TXT feed
def test_text_feed_content
login_as :admin_user