ramaze 2011.07.25 → 2011.10.23
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/.mailmap +3 -2
- data/.travis.yml +17 -0
- data/.yardopts +13 -0
- data/README.md +95 -352
- data/examples/app/blog/app.rb +25 -64
- data/examples/app/blog/config.ru +11 -9
- data/examples/app/blog/controller/init.rb +29 -86
- data/examples/app/blog/controller/posts.rb +232 -0
- data/examples/app/blog/controller/users.rb +160 -0
- data/examples/app/blog/layout/default.xhtml +61 -0
- data/examples/app/blog/migrations/01_create_schema.rb +50 -0
- data/examples/app/blog/model/comment.rb +41 -54
- data/examples/app/blog/model/init.rb +41 -13
- data/examples/app/blog/model/post.rb +35 -0
- data/examples/app/blog/model/user.rb +105 -0
- data/examples/app/blog/public/.htaccess +24 -0
- data/examples/app/blog/public/css/grid.css +107 -0
- data/examples/app/blog/public/css/layout.css +203 -0
- data/examples/app/blog/public/css/reset.css +123 -0
- data/examples/app/blog/public/css/text.css +109 -0
- data/examples/app/blog/public/dispatch.fcgi +11 -0
- data/examples/app/blog/public/favicon.ico +0 -0
- data/examples/app/blog/public/images/bg.png +0 -0
- data/examples/app/blog/start.rb +18 -3
- data/examples/app/blog/view/feed.xhtml +23 -0
- data/examples/app/blog/view/form.xhtml +11 -0
- data/examples/app/blog/view/index.xhtml +44 -0
- data/examples/app/blog/view/users/form.xhtml +12 -0
- data/examples/app/blog/view/users/index.xhtml +30 -0
- data/examples/app/blog/view/users/login.xhtml +8 -0
- data/examples/app/blog/view/view.xhtml +68 -0
- data/{doc → guide}/AUTHORS +5 -3
- data/{doc → guide}/CHANGELOG +428 -0
- data/{doc/GPL → guide/GPL_LICENSE} +0 -0
- data/{doc/COPYING → guide/RUBY_LICENSE} +3 -6
- data/guide/_static/logo.png +0 -0
- data/guide/_static/logo.svg +49 -0
- data/guide/_static/ramaze_console.png +0 -0
- data/guide/css/common.css +20 -0
- data/guide/general/cache.md +167 -0
- data/guide/general/configuration.md +168 -0
- data/guide/general/contributing.md +108 -0
- data/guide/general/controllers.md +115 -0
- data/guide/general/helpers.md +76 -0
- data/guide/general/installation.md +58 -0
- data/guide/general/logging.md +99 -0
- data/guide/general/middlewares.md +100 -0
- data/guide/general/models.md +78 -0
- data/guide/general/principles.md +53 -0
- data/guide/general/ramaze_command.md +155 -0
- data/guide/general/routes.md +81 -0
- data/guide/general/sessions.md +140 -0
- data/guide/general/special_thanks.md +67 -0
- data/guide/general/testing.md +61 -0
- data/guide/general/views.md +322 -0
- data/guide/tutorials/introduction.md +259 -0
- data/lib/proto/config.ru +1 -1
- data/lib/proto/public/favicon.ico +0 -0
- data/lib/proto/view/index.xhtml +7 -7
- data/lib/ramaze.rb +4 -4
- data/lib/ramaze/app.rb +11 -11
- data/lib/ramaze/app_graph.rb +2 -4
- data/lib/ramaze/bin/console.rb +3 -3
- data/lib/ramaze/bin/create.rb +2 -2
- data/lib/ramaze/bin/restart.rb +4 -4
- data/lib/ramaze/bin/runner.rb +5 -5
- data/lib/ramaze/bin/start.rb +19 -4
- data/lib/ramaze/bin/status.rb +3 -3
- data/lib/ramaze/bin/stop.rb +3 -3
- data/lib/ramaze/cache.rb +1 -0
- data/lib/ramaze/cache/lru.rb +8 -4
- data/lib/ramaze/cache/memcache.rb +32 -13
- data/lib/ramaze/cache/redis.rb +164 -0
- data/lib/ramaze/cache/sequel.rb +43 -28
- data/lib/ramaze/controller.rb +1 -2
- data/lib/ramaze/dependencies.rb +40 -3
- data/lib/ramaze/helper/bench.rb +26 -16
- data/lib/ramaze/helper/blue_form.rb +46 -73
- data/lib/ramaze/helper/cache.rb +10 -6
- data/lib/ramaze/helper/csrf.rb +35 -39
- data/lib/ramaze/helper/disqus.rb +5 -4
- data/lib/ramaze/helper/email.rb +35 -24
- data/lib/ramaze/helper/erector.rb +9 -13
- data/lib/ramaze/helper/flash.rb +7 -9
- data/lib/ramaze/helper/formatting.rb +194 -179
- data/lib/ramaze/helper/gravatar.rb +4 -8
- data/lib/ramaze/helper/identity.rb +3 -3
- data/lib/ramaze/helper/layout.rb +23 -8
- data/lib/ramaze/helper/markaby.rb +1 -1
- data/lib/ramaze/helper/paginate.rb +46 -39
- data/lib/ramaze/helper/request_accessor.rb +3 -1
- data/lib/ramaze/helper/simple_captcha.rb +18 -17
- data/lib/ramaze/helper/stack.rb +1 -1
- data/lib/ramaze/helper/tagz.rb +4 -2
- data/lib/ramaze/helper/upload.rb +523 -0
- data/lib/ramaze/helper/user.rb +4 -8
- data/lib/ramaze/helper/xhtml.rb +11 -15
- data/lib/ramaze/log.rb +9 -6
- data/lib/ramaze/log/rotatinginformer.rb +62 -27
- data/lib/ramaze/log/syslog.rb +20 -15
- data/lib/ramaze/log/xosd.rb +2 -1
- data/lib/ramaze/reloader.rb +2 -0
- data/lib/ramaze/request.rb +11 -10
- data/lib/ramaze/setup.rb +23 -6
- data/lib/ramaze/snippets/array/put_within.rb +3 -9
- data/lib/ramaze/snippets/binding/locals.rb +5 -10
- data/lib/ramaze/snippets/fiber.rb +1 -23
- data/lib/ramaze/snippets/kernel/pretty_inspect.rb +3 -6
- data/lib/ramaze/snippets/numeric/filesize_format.rb +3 -5
- data/lib/ramaze/snippets/numeric/time.rb +3 -7
- data/lib/ramaze/snippets/object/__dir__.rb +3 -7
- data/lib/ramaze/snippets/object/instance_variable_defined.rb +3 -6
- data/lib/ramaze/snippets/object/pretty.rb +3 -7
- data/lib/ramaze/snippets/object/scope.rb +7 -9
- data/lib/ramaze/snippets/proc/locals.rb +12 -12
- data/lib/ramaze/snippets/ramaze/acquire.rb +15 -14
- data/lib/ramaze/snippets/ramaze/deprecated.rb +1 -1
- data/lib/ramaze/snippets/ramaze/fiber.rb +1 -1
- data/lib/ramaze/snippets/ramaze/lru_hash.rb +2 -3
- data/lib/ramaze/snippets/ramaze/struct.rb +2 -4
- data/lib/ramaze/snippets/string/camel_case.rb +8 -10
- data/lib/ramaze/snippets/string/color.rb +3 -4
- data/lib/ramaze/snippets/string/end_with.rb +3 -6
- data/lib/ramaze/snippets/string/esc.rb +3 -8
- data/lib/ramaze/snippets/string/ord.rb +3 -8
- data/lib/ramaze/snippets/string/snake_case.rb +6 -9
- data/lib/ramaze/snippets/string/start_with.rb +3 -8
- data/lib/ramaze/snippets/string/unindent.rb +3 -6
- data/lib/ramaze/snippets/thread/into.rb +1 -3
- data/lib/ramaze/spec.rb +2 -31
- data/lib/ramaze/spec/bacon.rb +18 -2
- data/lib/ramaze/version.rb +1 -1
- data/lib/ramaze/view.rb +1 -1
- data/ramaze.gemspec +1 -1
- data/spec/helper.rb +2 -1
- data/spec/ramaze/bin/start.rb +16 -20
- data/spec/ramaze/cache/localmemcache.rb +4 -7
- data/spec/ramaze/cache/memcache.rb +3 -1
- data/spec/ramaze/cache/redis.rb +62 -0
- data/spec/ramaze/helper/blue_form.rb +33 -4
- data/spec/ramaze/helper/layout.rb +40 -7
- data/spec/ramaze/helper/upload.rb +149 -0
- data/spec/ramaze/helper/uploads/text_1.txt +1 -0
- data/spec/ramaze/helper/uploads/text_2.txt +1 -0
- data/spec/ramaze/log/growl.rb +4 -6
- data/spec/ramaze/log/syslog.rb +6 -0
- data/spec/ramaze/view/lokar.rb +5 -0
- data/spec/ramaze/view/nagoro.rb +5 -0
- data/tasks/authors.rake +1 -1
- data/tasks/bacon.rake +14 -5
- data/tasks/changelog.rake +1 -1
- data/tasks/yard.rake +12 -4
- metadata +277 -239
- data/doc/LEGAL +0 -26
- data/examples/app/blog/README +0 -3
- data/examples/app/blog/controller/comment.rb +0 -45
- data/examples/app/blog/controller/entry.rb +0 -85
- data/examples/app/blog/controller/main.rb +0 -20
- data/examples/app/blog/controller/tag.rb +0 -9
- data/examples/app/blog/layout/default.nag +0 -31
- data/examples/app/blog/model/entry.rb +0 -89
- data/examples/app/blog/model/tag.rb +0 -36
- data/examples/app/blog/public/css/screen.css +0 -273
- data/examples/app/blog/spec/blog.rb +0 -87
- data/examples/app/blog/view/comment/form.nag +0 -10
- data/examples/app/blog/view/comment/show.nag +0 -16
- data/examples/app/blog/view/entry/edit.nag +0 -14
- data/examples/app/blog/view/entry/feed.atom.nag +0 -8
- data/examples/app/blog/view/entry/feed.rss.nag +0 -7
- data/examples/app/blog/view/entry/index.nag +0 -7
- data/examples/app/blog/view/entry/new.nag +0 -13
- data/examples/app/blog/view/entry/show.nag +0 -36
- data/examples/app/blog/view/feed.atom.nag +0 -18
- data/examples/app/blog/view/feed.rss.nag +0 -25
- data/examples/app/blog/view/index.nag +0 -6
- data/examples/app/blog/view/tag/index.nag +0 -5
- data/lib/proto/public/ramaze.png +0 -0
- data/lib/ramaze/rest.rb +0 -36
- data/spec/ramaze/rest.rb +0 -28
- data/tasks/rcov.rake +0 -22
@@ -0,0 +1,160 @@
|
|
1
|
+
##
|
2
|
+
# The Users controller is used for managing users and allowing existing users to
|
3
|
+
# log in.
|
4
|
+
#
|
5
|
+
# @author Yorick Peterse
|
6
|
+
# @since 26-09-2011
|
7
|
+
#
|
8
|
+
class Users < BaseController
|
9
|
+
map '/users'
|
10
|
+
|
11
|
+
# The user has to be logged in in order to access this controller. The only
|
12
|
+
# exception is the login() method.
|
13
|
+
before_all do
|
14
|
+
if action.method.to_sym != :login and !logged_in?
|
15
|
+
flash[:error] = 'You need to be logged in to view that page'
|
16
|
+
redirect(Users.r(:login))
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
##
|
21
|
+
# Shows an overview of all the users that have been added to the database.
|
22
|
+
#
|
23
|
+
# @author Yorick Peterse
|
24
|
+
# @since 27-09-2011
|
25
|
+
#
|
26
|
+
def index
|
27
|
+
@users = paginate(User)
|
28
|
+
@title = 'Users'
|
29
|
+
end
|
30
|
+
|
31
|
+
##
|
32
|
+
# Allows users to add another user to the database.
|
33
|
+
#
|
34
|
+
# @author Yorick Peterse
|
35
|
+
# @since 27-09-2011
|
36
|
+
#
|
37
|
+
def new
|
38
|
+
@user = flash[:form_data] || User.new
|
39
|
+
@title = 'New user'
|
40
|
+
|
41
|
+
render_view(:form)
|
42
|
+
end
|
43
|
+
|
44
|
+
##
|
45
|
+
# Edits an existing user. If the specified user ID is invalid the user is
|
46
|
+
# redirected back to the previous page.
|
47
|
+
#
|
48
|
+
# @author Yorick Peterse
|
49
|
+
# @since 27-09-2011
|
50
|
+
# @param [Fixnum] id The ID of the user to edit.
|
51
|
+
#
|
52
|
+
def edit(id)
|
53
|
+
@user = flash[:form_data] || User[id]
|
54
|
+
|
55
|
+
if @user.nil?
|
56
|
+
flash[:error] = 'The specified user is invalid'
|
57
|
+
redirect_referrer
|
58
|
+
end
|
59
|
+
|
60
|
+
@title = "Edit #{@user.username}"
|
61
|
+
|
62
|
+
render_view(:form)
|
63
|
+
end
|
64
|
+
|
65
|
+
##
|
66
|
+
# Saves the changes made by Users#new() and Users#edit(). Just like
|
67
|
+
# Posts#save() this method is used for both methods since the actions required
|
68
|
+
# for adding/updating the data is pretty much identical.
|
69
|
+
#
|
70
|
+
# @author Yorick Peterse
|
71
|
+
# @since 27-09-2011
|
72
|
+
#
|
73
|
+
def save
|
74
|
+
data = request.subset(:username, :password)
|
75
|
+
id = request.params['id']
|
76
|
+
|
77
|
+
if !id.nil? and !id.empty?
|
78
|
+
user = User[id]
|
79
|
+
|
80
|
+
if user.nil?
|
81
|
+
flash[:error] = 'The specified user is invalid'
|
82
|
+
redirect_referrer
|
83
|
+
end
|
84
|
+
|
85
|
+
success = 'The user has been updated'
|
86
|
+
error = 'The user could not be updated'
|
87
|
+
else
|
88
|
+
user = User.new
|
89
|
+
success = 'The user has been added'
|
90
|
+
error = 'The user could not be added'
|
91
|
+
end
|
92
|
+
|
93
|
+
begin
|
94
|
+
user.update(data)
|
95
|
+
|
96
|
+
flash[:success] = success
|
97
|
+
redirect(Users.r(:edit, user.id))
|
98
|
+
rescue => e
|
99
|
+
Ramaze::Log.error(e)
|
100
|
+
|
101
|
+
flash[:error] = error
|
102
|
+
flash[:form_errors] = user.errors
|
103
|
+
flash[:form_data] = user
|
104
|
+
|
105
|
+
redirect_referrer
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
##
|
110
|
+
# Deletes a single user and redirects the user back to the overview.
|
111
|
+
#
|
112
|
+
# @author Yorick Peterse
|
113
|
+
# @since 27-09-2011
|
114
|
+
# @param [Fixnum] id The ID of the user to delete.
|
115
|
+
#
|
116
|
+
def delete(id)
|
117
|
+
begin
|
118
|
+
User.filter(:id => id).destroy
|
119
|
+
flash[:success] = 'The specified user has been removed'
|
120
|
+
rescue => e
|
121
|
+
Ramaze::Log.error(e)
|
122
|
+
flash[:error] = 'The specified user could not be removed'
|
123
|
+
end
|
124
|
+
|
125
|
+
redirect_referrer
|
126
|
+
end
|
127
|
+
|
128
|
+
##
|
129
|
+
# Allows a user to log in. Once logged in the user is able to manage existing
|
130
|
+
# users and edit posts.
|
131
|
+
#
|
132
|
+
# @author Yorick Peterse
|
133
|
+
# @since 27-09-2011
|
134
|
+
#
|
135
|
+
def login
|
136
|
+
if request.post?
|
137
|
+
if user_login(request.subset('username', 'password'))
|
138
|
+
flash[:success] = 'You have been logged in'
|
139
|
+
redirect(Posts.r(:index))
|
140
|
+
else
|
141
|
+
flash[:error] = 'You could not be logged in'
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
@title = 'Login'
|
146
|
+
end
|
147
|
+
|
148
|
+
##
|
149
|
+
# Logs the user out and destroys the session.
|
150
|
+
#
|
151
|
+
# @author Yorick Peterse
|
152
|
+
# @since 27-09-2011
|
153
|
+
#
|
154
|
+
def logout
|
155
|
+
user_logout
|
156
|
+
session.clear
|
157
|
+
flash[:success] = 'You have been logged out'
|
158
|
+
redirect(Users.r(:login))
|
159
|
+
end
|
160
|
+
end # Users
|
@@ -0,0 +1,61 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8" />
|
5
|
+
|
6
|
+
<title>#{@title}</title>
|
7
|
+
|
8
|
+
#{css('reset')}
|
9
|
+
#{css('grid')}
|
10
|
+
#{css('layout')}
|
11
|
+
#{css('text')}
|
12
|
+
</head>
|
13
|
+
<body>
|
14
|
+
<div class="container">
|
15
|
+
<div id="container" class="row">
|
16
|
+
<!-- Top part, contains the navigation menu -->
|
17
|
+
<div id="top" class="grid_12">
|
18
|
+
<header class="grid_6">
|
19
|
+
<h1>#{@title}</h1>
|
20
|
+
</header>
|
21
|
+
|
22
|
+
<nav class="grid_6 last">
|
23
|
+
<ul class="clearfix">
|
24
|
+
<li>#{Posts.a('Posts', :index)}</li>
|
25
|
+
|
26
|
+
<?r if logged_in? ?>
|
27
|
+
|
28
|
+
<li>#{Users.a('Users', :index)}</li>
|
29
|
+
<li>#{Users.a('Logout', :logout)}</li>
|
30
|
+
|
31
|
+
<?r else ?>
|
32
|
+
|
33
|
+
<li>#{Users.a('Login', :login)}</li>
|
34
|
+
|
35
|
+
<?r end ?>
|
36
|
+
</ul>
|
37
|
+
</nav>
|
38
|
+
</div>
|
39
|
+
|
40
|
+
<?r [:success, :error].each do |type| ?>
|
41
|
+
<?r if flash[type] ?>
|
42
|
+
<div class="message grid_12 #{type}">
|
43
|
+
<p>#{flash[type]}</p>
|
44
|
+
</div>
|
45
|
+
<?r end ?>
|
46
|
+
<?r end ?>
|
47
|
+
|
48
|
+
<div id="content" class="grid_12">
|
49
|
+
#{@content}
|
50
|
+
</div>
|
51
|
+
</div>
|
52
|
+
|
53
|
+
<footer id="footer">
|
54
|
+
<p>
|
55
|
+
Ramaze is free software and is licensed under the Ruby
|
56
|
+
license.
|
57
|
+
</p>
|
58
|
+
</footer>
|
59
|
+
</div>
|
60
|
+
</body>
|
61
|
+
</html>
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# For more information on Sequel migrations see the following page:
|
2
|
+
# http://sequel.rubyforge.org/rdoc/files/doc/migration_rdoc.html
|
3
|
+
Sequel.migration do
|
4
|
+
# The up() method and block is used to update a database to the current
|
5
|
+
# migration.
|
6
|
+
up do
|
7
|
+
create_table(:users) do
|
8
|
+
primary_key :id
|
9
|
+
|
10
|
+
String :username, :null => false
|
11
|
+
String :password, :null => false
|
12
|
+
end
|
13
|
+
|
14
|
+
create_table(:posts) do
|
15
|
+
primary_key :id
|
16
|
+
|
17
|
+
String :title, :null => false
|
18
|
+
String :body , :null => false, :text => true
|
19
|
+
|
20
|
+
Time :created_at
|
21
|
+
Time :updated_at
|
22
|
+
|
23
|
+
foreign_key :user_id, :users, :on_update => :cascade,
|
24
|
+
:on_delete => :cascade, :key => :id
|
25
|
+
end
|
26
|
+
|
27
|
+
create_table(:comments) do
|
28
|
+
primary_key :id
|
29
|
+
|
30
|
+
String :username, :null => true
|
31
|
+
String :comment , :null => false, :text => true
|
32
|
+
|
33
|
+
Time :created_at
|
34
|
+
|
35
|
+
foreign_key :post_id, :posts, :on_update => :cascade,
|
36
|
+
:on_delete => :cascade, :key => :id
|
37
|
+
|
38
|
+
foreign_key :user_id, :users, :on_update => :cascade,
|
39
|
+
:on_delete => :cascade, :key => :id
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# The down() method and block is used to revert the changes introduced by the
|
44
|
+
# up() block.
|
45
|
+
down do
|
46
|
+
drop_table(:comments)
|
47
|
+
drop_table(:posts)
|
48
|
+
drop_table(:users)
|
49
|
+
end
|
50
|
+
end
|
@@ -1,58 +1,45 @@
|
|
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
|
-
validations.clear
|
28
|
-
|
29
|
-
validates do
|
30
|
-
length_of :author, :within => (2..255)
|
31
|
-
# yay, reddit! we should rather set a minimum like:
|
32
|
-
# "I, for one, welcome our new x overlords.".size
|
33
|
-
length_of :content, :minimum => 2
|
34
|
-
|
35
|
-
# a@b.c anyone know a domain like that?
|
36
|
-
length_of :email, :within => (5..255)
|
37
|
-
format_of :email, :with => /^([^@\s]{1}+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
|
38
|
-
|
39
|
-
format_of :homepage, :with => /^https?:\/\/[^\s\/]+\.[^\s\/]+/
|
40
|
-
end
|
41
|
-
|
42
|
-
def href
|
43
|
-
Entries.r(:/, "#{entry.slug}#comment-#{id}")
|
1
|
+
##
|
2
|
+
# The Comment model is used for creating and managing comments.
|
3
|
+
#
|
4
|
+
# @author Yorick Peterse
|
5
|
+
# @since 26-09-2011
|
6
|
+
#
|
7
|
+
class Comment < Sequel::Model
|
8
|
+
plugin :timestamps, :create => :created_at, :update => :updated_at
|
9
|
+
|
10
|
+
# A comment can belong to only one post and one user
|
11
|
+
many_to_one :post
|
12
|
+
many_to_one :user
|
13
|
+
|
14
|
+
##
|
15
|
+
# Validates a comment before saving it to the database.
|
16
|
+
#
|
17
|
+
# @author Yorick Peterse
|
18
|
+
# @since 26-09-2011
|
19
|
+
#
|
20
|
+
def validate
|
21
|
+
validates_presence(:comment)
|
22
|
+
|
23
|
+
# Comments can either have user ID or a custom name. The user ID is only set
|
24
|
+
# when the user is logged in.
|
25
|
+
unless self.user_id
|
26
|
+
validates_presence(:username)
|
44
27
|
end
|
28
|
+
end
|
45
29
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
30
|
+
##
|
31
|
+
# Gets the name of the author from either an associated user or the "name"
|
32
|
+
# field.
|
33
|
+
#
|
34
|
+
# @author Yorick Peterse
|
35
|
+
# @since 26-09-2011
|
36
|
+
# @return [String]
|
37
|
+
#
|
38
|
+
def username
|
39
|
+
if user and user.username
|
40
|
+
return user.username
|
41
|
+
else
|
42
|
+
return super
|
56
43
|
end
|
57
44
|
end
|
58
|
-
end
|
45
|
+
end # Comment
|
@@ -1,16 +1,44 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# Configure Sequel. This example uses a SQLite3 database with it's encoding set
|
2
|
+
# to UTF-8. The :test option is used to confirm that the database connection is
|
3
|
+
# valid before it's actually being used. In this case the connection returned by
|
4
|
+
# Sequel.connect is stored in a constant called "DB" but you're free to store it
|
5
|
+
# wherever you want.
|
6
|
+
DB = Sequel.connect(
|
7
|
+
:adapter => 'sqlite',
|
8
|
+
:database => __DIR__('../database.db'),
|
9
|
+
:test => true,
|
10
|
+
:encoding => 'utf8'
|
11
|
+
)
|
3
12
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
13
|
+
# The validation_helpers plugin is required if you want to use the #validate()
|
14
|
+
# method in your model in combination with easy to use methods such as
|
15
|
+
# validates_presence().
|
16
|
+
Sequel::Model.plugin(:validation_helpers)
|
17
|
+
|
18
|
+
# The migration extension is needed in order to run migrations.
|
19
|
+
Sequel.extension(:migration)
|
20
|
+
|
21
|
+
# The pagination extension is needed by Ramaze::Helper::Paginate.
|
22
|
+
Sequel.extension(:pagination)
|
23
|
+
|
24
|
+
# Migrate the database
|
25
|
+
Sequel::Migrator.run(DB, __DIR__('../migrations'))
|
8
26
|
|
9
|
-
Sequel.
|
10
|
-
|
11
|
-
|
12
|
-
|
27
|
+
# Time to load all the models now that Sequel is set up.
|
28
|
+
require __DIR__('comment')
|
29
|
+
require __DIR__('post')
|
30
|
+
require __DIR__('user')
|
13
31
|
|
14
|
-
|
15
|
-
|
16
|
-
|
32
|
+
# Insert the default user if this hasn't already been done so.
|
33
|
+
unless User[:username => 'admin']
|
34
|
+
User.create(:username => 'admin', :password => 'admin')
|
35
|
+
end
|
36
|
+
|
37
|
+
# Insert a default post if no posts have been added.
|
38
|
+
if Post.all.empty?
|
39
|
+
Post.create(
|
40
|
+
:title => 'Example Post',
|
41
|
+
:body => 'This is a post that uses Markdown!',
|
42
|
+
:user_id => User[:username => 'admin'].id
|
43
|
+
)
|
44
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
##
|
2
|
+
# The Post class is a model that's used for managing posts. The corresponding
|
3
|
+
# table is called "posts". For more information on how Sequel works see the
|
4
|
+
# following page: http://sequel.rubyforge.org/documentation.html
|
5
|
+
#
|
6
|
+
# @author Yorick Peterse
|
7
|
+
# @since 26-09-2011
|
8
|
+
#
|
9
|
+
class Post < Sequel::Model
|
10
|
+
# The timestamps plugin is used to automatically fill two database columns
|
11
|
+
# with the dates and times on which an object was created and when it was
|
12
|
+
# modified.
|
13
|
+
plugin :timestamps, :create => :created_at, :update => :updated_at
|
14
|
+
|
15
|
+
# Multiple posts can only belong to a single user.
|
16
|
+
many_to_one :user
|
17
|
+
one_to_many :comments
|
18
|
+
|
19
|
+
##
|
20
|
+
# Post#validate() is called whenever an instance of this class is saved or
|
21
|
+
# updated. For more information on what you can do with this method see the
|
22
|
+
# following page:
|
23
|
+
# http://sequel.rubyforge.org/rdoc/files/doc/validations_rdoc.html
|
24
|
+
#
|
25
|
+
# If you're used to working with ActiveRecord it's important to remember that
|
26
|
+
# these validation methods can't be used in a model's class declaration, they
|
27
|
+
# have to be placed inside the #validate() method.
|
28
|
+
#
|
29
|
+
# @author Yorick Peterse
|
30
|
+
# @since 26-09-2011
|
31
|
+
#
|
32
|
+
def validate
|
33
|
+
validates_presence([:title, :body])
|
34
|
+
end
|
35
|
+
end # Post
|