Todos done
This commit is contained in:
parent
a9e89d00ef
commit
976488dbe1
10 changed files with 320 additions and 90 deletions
225
.idea/workspace.xml
generated
225
.idea/workspace.xml
generated
|
|
@ -2,20 +2,15 @@
|
|||
<project version="4">
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="42443dfa-4405-4cad-b0d1-6c57eb86e644" name="Default" comment="">
|
||||
<change beforePath="" afterPath="$PROJECT_DIR$/.idea/inspectionProfiles/Project_Default.xml" />
|
||||
<change beforePath="" afterPath="$PROJECT_DIR$/.rspec" />
|
||||
<change beforePath="" afterPath="$PROJECT_DIR$/app/models/item.rb" />
|
||||
<change beforePath="" afterPath="$PROJECT_DIR$/app/models/todo.rb" />
|
||||
<change beforePath="" afterPath="$PROJECT_DIR$/db/migrate/20180216101219_create_todos.rb" />
|
||||
<change beforePath="" afterPath="$PROJECT_DIR$/db/migrate/20180216101247_create_items.rb" />
|
||||
<change beforePath="" afterPath="$PROJECT_DIR$/spec/models/item_spec.rb" />
|
||||
<change beforePath="" afterPath="$PROJECT_DIR$/spec/models/todo_spec.rb" />
|
||||
<change beforePath="" afterPath="$PROJECT_DIR$/spec/rails_helper.rb" />
|
||||
<change beforePath="" afterPath="$PROJECT_DIR$/spec/spec_helper.rb" />
|
||||
<change beforePath="" afterPath="$PROJECT_DIR$/app/controllers/concerns/response.rb" />
|
||||
<change beforePath="" afterPath="$PROJECT_DIR$/spec/support/request_spec_helper.rb" />
|
||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" />
|
||||
<change beforePath="$PROJECT_DIR$/Gemfile" afterPath="$PROJECT_DIR$/Gemfile" />
|
||||
<change beforePath="$PROJECT_DIR$/Gemfile.lock" afterPath="$PROJECT_DIR$/Gemfile.lock" />
|
||||
<change beforePath="$PROJECT_DIR$/config/database.yml" afterPath="$PROJECT_DIR$/config/database.yml" />
|
||||
<change beforePath="$PROJECT_DIR$/app/controllers/application_controller.rb" afterPath="$PROJECT_DIR$/app/controllers/application_controller.rb" />
|
||||
<change beforePath="$PROJECT_DIR$/app/controllers/concerns/.keep" afterPath="$PROJECT_DIR$/app/controllers/concerns/exception_handler.rb" />
|
||||
<change beforePath="$PROJECT_DIR$/app/controllers/todos_controller.rb" afterPath="$PROJECT_DIR$/app/controllers/todos_controller.rb" />
|
||||
<change beforePath="$PROJECT_DIR$/config/routes.rb" afterPath="$PROJECT_DIR$/config/routes.rb" />
|
||||
<change beforePath="$PROJECT_DIR$/spec/rails_helper.rb" afterPath="$PROJECT_DIR$/spec/rails_helper.rb" />
|
||||
<change beforePath="$PROJECT_DIR$/spec/requests/todos_spec.rb" afterPath="$PROJECT_DIR$/spec/requests/todos_spec.rb" />
|
||||
</list>
|
||||
<ignored path="$PROJECT_DIR$/.bundle/" />
|
||||
<ignored path="$PROJECT_DIR$/components/" />
|
||||
|
|
@ -32,31 +27,11 @@
|
|||
</component>
|
||||
<component name="FileEditorManager">
|
||||
<leaf>
|
||||
<file leaf-file-name="items_controller.rb" pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/app/controllers/items_controller.rb">
|
||||
<file leaf-file-name="routes.rb" pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/config/routes.rb">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="0">
|
||||
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file leaf-file-name="todos.rb" pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/spec/factories/todos.rb">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="108">
|
||||
<caret line="6" column="3" lean-forward="false" selection-start-line="6" selection-start-column="3" selection-end-line="6" selection-end-column="3" />
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file leaf-file-name="items.rb" pinned="false" current-in-tab="true">
|
||||
<entry file="file://$PROJECT_DIR$/spec/factories/items.rb">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="126">
|
||||
<caret line="7" column="3" lean-forward="false" selection-start-line="7" selection-start-column="3" selection-end-line="7" selection-end-column="3" />
|
||||
<state relative-caret-position="54">
|
||||
<caret line="3" column="20" lean-forward="false" selection-start-line="3" selection-start-column="20" selection-end-line="3" selection-end-column="20" />
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
|
|
@ -65,8 +40,38 @@
|
|||
<file leaf-file-name="todos_controller.rb" pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/app/controllers/todos_controller.rb">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="0">
|
||||
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
|
||||
<state relative-caret-position="288">
|
||||
<caret line="16" column="10" lean-forward="true" selection-start-line="16" selection-start-column="10" selection-end-line="16" selection-end-column="10" />
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file leaf-file-name="application_controller.rb" pinned="false" current-in-tab="true">
|
||||
<entry file="file://$PROJECT_DIR$/app/controllers/application_controller.rb">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="36">
|
||||
<caret line="2" column="26" lean-forward="false" selection-start-line="2" selection-start-column="26" selection-end-line="2" selection-end-column="26" />
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file leaf-file-name="response.rb" pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/app/controllers/concerns/response.rb">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="72">
|
||||
<caret line="4" column="3" lean-forward="true" selection-start-line="4" selection-start-column="3" selection-end-line="4" selection-end-column="3" />
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file leaf-file-name="exception_handler.rb" pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/app/controllers/concerns/exception_handler.rb">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="162">
|
||||
<caret line="9" column="64" lean-forward="false" selection-start-line="9" selection-start-column="64" selection-end-line="9" selection-end-column="64" />
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
|
|
@ -80,7 +85,6 @@
|
|||
<component name="IdeDocumentHistory">
|
||||
<option name="CHANGED_PATHS">
|
||||
<list>
|
||||
<option value="$PROJECT_DIR$/spec/rails_helper.rb" />
|
||||
<option value="$PROJECT_DIR$/Gemfile" />
|
||||
<option value="$PROJECT_DIR$/spec/models/todo_spec.rb" />
|
||||
<option value="$PROJECT_DIR$/spec/models/item_spec.rb" />
|
||||
|
|
@ -89,6 +93,14 @@
|
|||
<option value="$PROJECT_DIR$/app/models/todo.rb" />
|
||||
<option value="$PROJECT_DIR$/spec/factories/todos.rb" />
|
||||
<option value="$PROJECT_DIR$/spec/factories/items.rb" />
|
||||
<option value="$PROJECT_DIR$/spec/requests/todos_spec.rb" />
|
||||
<option value="$PROJECT_DIR$/spec/support/request_spec_helper.rb" />
|
||||
<option value="$PROJECT_DIR$/spec/rails_helper.rb" />
|
||||
<option value="$PROJECT_DIR$/config/routes.rb" />
|
||||
<option value="$PROJECT_DIR$/app/controllers/todos_controller.rb" />
|
||||
<option value="$PROJECT_DIR$/app/controllers/concerns/response.rb" />
|
||||
<option value="$PROJECT_DIR$/app/controllers/concerns/exception_handler.rb" />
|
||||
<option value="$PROJECT_DIR$/app/controllers/application_controller.rb" />
|
||||
</list>
|
||||
</option>
|
||||
</component>
|
||||
|
|
@ -139,6 +151,13 @@
|
|||
<item name="app" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="controllers" type="462c0819:PsiDirectoryNode" />
|
||||
</path>
|
||||
<path>
|
||||
<item name="vereto-api" type="b2602c69:ProjectViewProjectNode" />
|
||||
<item name="vereto-api" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="app" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="controllers" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="concerns" type="462c0819:PsiDirectoryNode" />
|
||||
</path>
|
||||
<path>
|
||||
<item name="vereto-api" type="b2602c69:ProjectViewProjectNode" />
|
||||
<item name="vereto-api" type="462c0819:PsiDirectoryNode" />
|
||||
|
|
@ -148,19 +167,7 @@
|
|||
<path>
|
||||
<item name="vereto-api" type="b2602c69:ProjectViewProjectNode" />
|
||||
<item name="vereto-api" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="spec" type="462c0819:PsiDirectoryNode" />
|
||||
</path>
|
||||
<path>
|
||||
<item name="vereto-api" type="b2602c69:ProjectViewProjectNode" />
|
||||
<item name="vereto-api" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="spec" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="factories" type="462c0819:PsiDirectoryNode" />
|
||||
</path>
|
||||
<path>
|
||||
<item name="vereto-api" type="b2602c69:ProjectViewProjectNode" />
|
||||
<item name="vereto-api" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="spec" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="models" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="config" type="462c0819:PsiDirectoryNode" />
|
||||
</path>
|
||||
</expand>
|
||||
<select />
|
||||
|
|
@ -302,12 +309,12 @@
|
|||
<option name="presentableId" value="Default" />
|
||||
<updated>1518771982661</updated>
|
||||
<workItem from="1518771986536" duration="30000" />
|
||||
<workItem from="1518772064427" duration="6225000" />
|
||||
<workItem from="1518772064427" duration="7202000" />
|
||||
</task>
|
||||
<servers />
|
||||
</component>
|
||||
<component name="TimeTrackingManager">
|
||||
<option name="totallyTimeSpent" value="6255000" />
|
||||
<option name="totallyTimeSpent" value="7232000" />
|
||||
</component>
|
||||
<component name="ToolWindowManager">
|
||||
<frame x="0" y="28" width="1920" height="1026" extended-state="6" />
|
||||
|
|
@ -319,18 +326,18 @@
|
|||
<window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="true" content_ui="tabs" />
|
||||
<window_info id="Database" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
|
||||
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
|
||||
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
|
||||
<window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
|
||||
<window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.33799785" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
|
||||
<window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" />
|
||||
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
|
||||
<window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
|
||||
<window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
|
||||
<window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
|
||||
<window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
|
||||
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
|
||||
<window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
|
||||
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
|
||||
<window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
|
||||
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
|
||||
</layout>
|
||||
</component>
|
||||
<component name="TypeScriptGeneratedFilesManager">
|
||||
|
|
@ -352,14 +359,6 @@
|
|||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/app/controllers/application_controller.rb">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="0">
|
||||
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/app/channels/application_cable/channel.rb">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="0">
|
||||
|
|
@ -368,14 +367,6 @@
|
|||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/spec/rails_helper.rb">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="275">
|
||||
<caret line="57" column="52" lean-forward="true" selection-start-line="57" selection-start-column="52" selection-end-line="57" selection-end-column="52" />
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/Gemfile">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="198">
|
||||
|
|
@ -448,22 +439,6 @@
|
|||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/app/controllers/todos_controller.rb">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="0">
|
||||
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/app/controllers/items_controller.rb">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="0">
|
||||
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/spec/factories/todos.rb">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="108">
|
||||
|
|
@ -480,5 +455,77 @@
|
|||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/app/controllers/items_controller.rb">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="0">
|
||||
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/spec/support/request_spec_helper.rb">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="108">
|
||||
<caret line="6" column="3" lean-forward="false" selection-start-line="6" selection-start-column="3" selection-end-line="6" selection-end-column="3" />
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/spec/rails_helper.rb">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="396">
|
||||
<caret line="46" column="50" lean-forward="false" selection-start-line="46" selection-start-column="50" selection-end-line="46" selection-end-column="50" />
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/spec/requests/todos_spec.rb">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="527">
|
||||
<caret line="108" column="3" lean-forward="false" selection-start-line="108" selection-start-column="3" selection-end-line="108" selection-end-column="3" />
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/config/routes.rb">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="54">
|
||||
<caret line="3" column="20" lean-forward="false" selection-start-line="3" selection-start-column="20" selection-end-line="3" selection-end-column="20" />
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/app/controllers/concerns/response.rb">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="72">
|
||||
<caret line="4" column="3" lean-forward="true" selection-start-line="4" selection-start-column="3" selection-end-line="4" selection-end-column="3" />
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/app/controllers/concerns/exception_handler.rb">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="162">
|
||||
<caret line="9" column="64" lean-forward="false" selection-start-line="9" selection-start-column="64" selection-end-line="9" selection-end-column="64" />
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/app/controllers/todos_controller.rb">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="288">
|
||||
<caret line="16" column="10" lean-forward="true" selection-start-line="16" selection-start-column="10" selection-end-line="16" selection-end-column="10" />
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/app/controllers/application_controller.rb">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="36">
|
||||
<caret line="2" column="26" lean-forward="false" selection-start-line="2" selection-start-column="26" selection-end-line="2" selection-end-column="26" />
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</component>
|
||||
</project>
|
||||
|
|
@ -1,2 +1,4 @@
|
|||
class ApplicationController < ActionController::API
|
||||
include Response
|
||||
include ExceptionHandler
|
||||
end
|
||||
|
|
|
|||
14
app/controllers/concerns/exception_handler.rb
Normal file
14
app/controllers/concerns/exception_handler.rb
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
module ExceptionHandler
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
rescue_from ActiveRecord::RecordNotFound do |e|
|
||||
json_response({ message: e.message}, :not_found)
|
||||
end
|
||||
|
||||
rescue_from ActiveRecord::RecordInvalid do |e|
|
||||
json_response({ message: e.message}, :unprocessable_entity)
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
5
app/controllers/concerns/response.rb
Normal file
5
app/controllers/concerns/response.rb
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
module Response
|
||||
def json_response(object, status = :ok)
|
||||
render json: object, status: status
|
||||
end
|
||||
end
|
||||
|
|
@ -1,2 +1,44 @@
|
|||
class TodosController < ApplicationController
|
||||
before_action :set_todo, only: [:show, :update, :destroy]
|
||||
|
||||
# GET /todos
|
||||
def index
|
||||
@todos = Todo.all
|
||||
json_response(@todos)
|
||||
end
|
||||
|
||||
# POST /todos
|
||||
def create
|
||||
@todo = Todo.create!(todo_params)
|
||||
json_response(@todo, :created)
|
||||
end
|
||||
|
||||
# GET /todos/:id
|
||||
def show
|
||||
json_response(@todo)
|
||||
end
|
||||
|
||||
# PUT /todos/:id
|
||||
def update
|
||||
@todo.update(todo_params)
|
||||
head :no_content
|
||||
end
|
||||
|
||||
# DELETE /todos/:id
|
||||
def destroy
|
||||
@todo.destroy
|
||||
head :no_content
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def todo_params
|
||||
# whitelist params
|
||||
params.permit(:title, :created_by)
|
||||
end
|
||||
|
||||
def set_todo
|
||||
@todo = Todo.find(params[:id])
|
||||
end
|
||||
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,3 +1,6 @@
|
|||
Rails.application.routes.draw do
|
||||
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
|
||||
resources :todos do
|
||||
resources :items
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@ end
|
|||
# Checks for pending migrations and applies them before tests are run.
|
||||
# If you are not using ActiveRecord, you can remove this line.
|
||||
ActiveRecord::Migration.maintain_test_schema!
|
||||
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
|
||||
|
||||
RSpec.configure do |config|
|
||||
# Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
|
||||
|
|
@ -43,7 +44,7 @@ RSpec.configure do |config|
|
|||
config.use_transactional_fixtures = true
|
||||
# add `FactoryGirl` methods
|
||||
config.include FactoryGirl::Syntax::Methods
|
||||
|
||||
config.include RequestSpecHelper, type: :request
|
||||
# start by truncating all the tables but then use the faster transaction strategy the rest of the time.
|
||||
config.before(:suite) do
|
||||
DatabaseCleaner.clean_with(:truncation)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,109 @@
|
|||
# spec/requests/todos_spec.rb
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe 'Todos API', type: :request do
|
||||
# initialize test data
|
||||
let!(:todos) { create_list(:todo, 10) }
|
||||
let(:todo_id) { todos.first.id }
|
||||
|
||||
# Test suite for GET /todos
|
||||
describe 'GET /todos' do
|
||||
# make HTTP get request before each example
|
||||
before { get '/todos' }
|
||||
|
||||
it 'returns todos' do
|
||||
# Note `json` is a custom helper to parse JSON responses
|
||||
expect(json).not_to be_empty
|
||||
expect(json.size).to eq(10)
|
||||
end
|
||||
|
||||
it 'returns status code 200' do
|
||||
expect(response).to have_http_status(200)
|
||||
end
|
||||
end
|
||||
|
||||
# Test suite for GET /todos/:id
|
||||
describe 'GET /todos/:id' do
|
||||
before { get "/todos/#{todo_id}" }
|
||||
|
||||
context 'when the record exists' do
|
||||
it 'returns the todo' do
|
||||
expect(json).not_to be_empty
|
||||
expect(json['id']).to eq(todo_id)
|
||||
end
|
||||
|
||||
it 'returns status code 200' do
|
||||
expect(response).to have_http_status(200)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when the record does not exist' do
|
||||
let(:todo_id) { 100 }
|
||||
|
||||
it 'returns status code 404' do
|
||||
expect(response).to have_http_status(404)
|
||||
end
|
||||
|
||||
it 'returns a not found message' do
|
||||
expect(response.body).to match(/Couldn't find Todo/)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Test suite for POST /todos
|
||||
describe 'POST /todos' do
|
||||
# valid payload
|
||||
let(:valid_attributes) { { title: 'Learn Elm', created_by: '1' } }
|
||||
|
||||
context 'when the request is valid' do
|
||||
before { post '/todos', params: valid_attributes }
|
||||
|
||||
it 'creates a todo' do
|
||||
expect(json['title']).to eq('Learn Elm')
|
||||
end
|
||||
|
||||
it 'returns status code 201' do
|
||||
expect(response).to have_http_status(201)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when the request is invalid' do
|
||||
before { post '/todos', params: { title: 'Foobar' } }
|
||||
|
||||
it 'returns status code 422' do
|
||||
expect(response).to have_http_status(422)
|
||||
end
|
||||
|
||||
it 'returns a validation failure message' do
|
||||
expect(response.body)
|
||||
.to match(/Validation failed: Created by can't be blank/)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Test suite for PUT /todos/:id
|
||||
describe 'PUT /todos/:id' do
|
||||
let(:valid_attributes) { { title: 'Shopping' } }
|
||||
|
||||
context 'when the record exists' do
|
||||
before { put "/todos/#{todo_id}", params: valid_attributes }
|
||||
|
||||
it 'updates the record' do
|
||||
expect(response.body).to be_empty
|
||||
end
|
||||
|
||||
it 'returns status code 204' do
|
||||
expect(response).to have_http_status(204)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Test suite for DELETE /todos/:id
|
||||
describe 'DELETE /todos/:id' do
|
||||
before { delete "/todos/#{todo_id}" }
|
||||
|
||||
it 'returns status code 204' do
|
||||
expect(response).to have_http_status(204)
|
||||
end
|
||||
end
|
||||
end
|
||||
7
spec/support/request_spec_helper.rb
Normal file
7
spec/support/request_spec_helper.rb
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
# spec/support/request_spec_helper
|
||||
module RequestSpecHelper
|
||||
# Parse JSON response to ruby hash
|
||||
def json
|
||||
JSON.parse(response.body)
|
||||
end
|
||||
end
|
||||
Loading…
Add table
Reference in a new issue