mirror of
https://github.com/TracksApp/tracks.git
synced 2026-01-09 18:58:51 +01:00
use state machine from controller and handle exception
This commit is contained in:
parent
004339a2ca
commit
2719cb87c7
3 changed files with 54 additions and 33 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue