-
Notifications
You must be signed in to change notification settings - Fork 30
/
final.rb
106 lines (95 loc) · 2.92 KB
/
final.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
=begin
Created on Feb 2nd, 2016
A toy Sinatra app to demostrate the basic concept of MVC, RESTful Routes and CRUD.
Run ``bundle install`` to make sure you have necessary gems installed.
TO run the script, type ``ruby final.rb`` in command line.
@author: hezheng.yin
=end
# load libraries we need
require 'sinatra'
require 'active_record'
require 'json'
# tell active_record which database to connect to
db_options = {adapter: 'sqlite3', database: 'todos_db'}
ActiveRecord::Base.establish_connection(db_options)
# write migration class for creating Todo table in database
### how do we write migration in rails?
class CreateTodos < ActiveRecord::Migration
def change
create_table :todos do |t|
t.string :description
end
end
end
# create Todo table by executing the function we just wrote
### how do apply migration in rails?
### why do we handle exception here?
begin
CreateTodos.new.change
rescue ActiveRecord::StatementInvalid
# it's probably OK
end
# create Todo class by inheriting from ActiveRecord::Base
### how do we write new class in Rails?
### why there's no setter and getter method (or attr_accessor)?
class Todo < ActiveRecord::Base
validates :description, presence: true, allow_blank: false
end
# populate the database if it is empty (avoid running this piece of code twice)
### do you still remember this cleaner and simpler hash syntax?
if Todo.all.empty?
Todo.create(description: "prepare for discussion section")
Todo.create(description: "release cs169 hw3")
end
# display all todos
get '/todos' do
content_type :json
Todo.all.to_json
end
# show a specific todo
get '/todos/:id' do
content_type :json
todo = Todo.find_by_id(params[:id])
if todo
return {description: todo.description}.to_json
else
return {msg: "error: specified todo not found"}.to_json
end
end
# create a new todo
# goal: if we receive non-empty description, render json with msg set to "create success"
# otherwise render json with msg set to "error: description can't be blank"
post '/todos' do
content_type :json
todo = Todo.new(description: params[:description])
if todo.save
return {msg: "create success"}.to_json
else
return {msg: todo.errors}.to_json
end
end
# update a todo
# return: if todo with specified id exist and description non-empty, render json with msg set to "update success"
# otherwise render json with msg set to "upate failure"
put '/todos/:id' do
content_type :json
todo = Todo.find(params[:id])
if todo.update_attribute(:description, params[:description])
return {msg: "update success"}.to_json
else
return {msg: todo.errors}.to_json
end
end
# delete a todo
# return: if todo with specified id exist, render json with msg set to "delete success"
# otherwise render json with msg set to "delete failure"
delete '/todos/:id' do
content_type :json
todo = Todo.find(params[:id])
if todo
todo.destroy
return {msg: "delete success"}.to_json
else
return {msg: "delete failure"}.to_json
end
end