Guest User

Untitled

a guest
Mar 2nd, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.88 KB | None | 0 0
  1. #!/usr/bin/env ruby
  2.  
  3. $:.unshift File.dirname(__FILE__) + "/../../lib"
  4. require 'camping'
  5. require 'camping/session'
  6.  
  7. Camping.goes :Blog
  8.  
  9. module Kindling
  10. module Filters
  11.  
  12. def service(*args)
  13. # I also tried method(sym).call and it threw the same error...
  14. self.class.before_filters.each {|sym| send(sym) }
  15. super(*args)
  16. self.class.after_filter.each {|sym| send(sym) }
  17. end
  18.  
  19. class << self
  20. attr_accessor :before_filters, :after_filter
  21. def before_filter(sym)
  22. (self.before_filters||=[]) << sym.to_sym
  23. end
  24.  
  25. def after_filter(sym)
  26. (self.after_filter||=[]) << sym.to_sym
  27. end
  28. end
  29. end
  30. end
  31.  
  32. module Blog
  33. include Kindling::Filters
  34. before_filter(:set_value)
  35.  
  36. def set_value
  37. @my_value = "Before filter!"
  38. end
  39. end
  40.  
  41. module Blog::Models
  42. class Post < Base; belongs_to :user; end
  43. class Comment < Base; belongs_to :user; end
  44. class User < Base; end
  45.  
  46. class CreateTheBasics < V 1.0
  47. def self.up
  48. create_table :blog_posts, :force => true do |t|
  49. t.column :id, :integer, :null => false
  50. t.column :user_id, :integer, :null => false
  51. t.column :title, :string, :limit => 255
  52. t.column :body, :text
  53. end
  54. create_table :blog_users, :force => true do |t|
  55. t.column :id, :integer, :null => false
  56. t.column :username, :string
  57. t.column :password, :string
  58. end
  59. create_table :blog_comments, :force => true do |t|
  60. t.column :id, :integer, :null => false
  61. t.column :post_id, :integer, :null => false
  62. t.column :username, :string
  63. t.column :body, :text
  64. end
  65. User.create :username => 'admin', :password => 'camping'
  66. end
  67. def self.down
  68. drop_table :blog_posts
  69. drop_table :blog_users
  70. drop_table :blog_comments
  71. end
  72. end
  73. end
  74.  
  75. module Blog::Controllers
  76. class Index < R '/'
  77. def get
  78. @posts = Post.find :all
  79.  
  80. render :index
  81. end
  82. end
  83.  
  84. class Add
  85. def get
  86. unless @state.user_id.blank?
  87. @user = User.find @state.user_id
  88. @post = Post.new
  89. end
  90. render :add
  91. end
  92. def post
  93. unless @state.user_id.blank?
  94. post = Post.create :title => input.post_title, :body => input.post_body,
  95. :user_id => @state.user_id
  96. redirect View, post
  97. end
  98. end
  99. end
  100.  
  101. class Info < R '/info/(\d+)', '/info/(\w+)/(\d+)', '/info', '/info/(\d+)/(\d+)/(\d+)/([\w-]+)'
  102. def get(*args)
  103. div do
  104. code args.inspect; br; br
  105. code @env.inspect; br
  106. code "Link: #{R(Info, 1, 2)}"
  107. end
  108. end
  109. end
  110.  
  111. class View < R '/view/(\d+)'
  112. def get post_id
  113. @post = Post.find post_id
  114. @comments = Models::Comment.find :all, :conditions => ['post_id = ?', post_id]
  115. render :view
  116. end
  117. end
  118.  
  119. class Edit < R '/edit/(\d+)', '/edit'
  120. def get post_id
  121. unless @state.user_id.blank?
  122. @user = User.find @state.user_id
  123. end
  124. @post = Post.find post_id
  125. render :edit
  126. end
  127.  
  128. def post
  129. unless @state.user_id.blank?
  130. @post = Post.find input.post_id
  131. @post.update_attributes :title => input.post_title, :body => input.post_body
  132. redirect View, @post
  133. end
  134. end
  135. end
  136.  
  137. class Comment
  138. def post
  139. Models::Comment.create(:username => input.post_username,
  140. :body => input.post_body, :post_id => input.post_id)
  141. redirect View, input.post_id
  142. end
  143. end
  144.  
  145. class Login
  146. def post
  147. @user = User.find :first, :conditions => ['username = ? AND password = ?', input.username, input.password]
  148.  
  149. if @user
  150. @login = 'login success !'
  151. @state.user_id = @user.id
  152. else
  153. @login = 'wrong user name or password'
  154. end
  155. render :login
  156. end
  157. end
  158.  
  159. class Logout
  160. def get
  161. @state.user_id = nil
  162. render :logout
  163. end
  164. end
  165.  
  166. class Style < R '/styles.css'
  167. def get
  168. @headers["Content-Type"] = "text/css; charset=utf-8"
  169. @body = %{
  170. body {
  171. font-family: Utopia, Georga, serif;
  172. }
  173. h1.header {
  174. background-color: #fef;
  175. margin: 0; padding: 10px;
  176. }
  177. div.content {
  178. padding: 10px;
  179. }
  180. }
  181. end
  182. end
  183. end
  184.  
  185. module Blog::Views
  186.  
  187. def layout
  188. html do
  189. head do
  190. title 'blog'
  191. link :rel => 'stylesheet', :type => 'text/css',
  192. :href => '/styles.css', :media => 'screen'
  193. end
  194. body do
  195. h1.header { a 'blog', :href => R(Index) }
  196. div.content do
  197. self << yield
  198. end
  199. end
  200. end
  201. end
  202.  
  203. def index
  204. if @posts.empty?
  205. p 'No posts found.'
  206. p { a 'Add', :href => R(Add) }
  207. p { span "Value: " + @my_value }
  208. else
  209. for post in @posts
  210. _post(post)
  211. end
  212. end
  213. end
  214.  
  215. def login
  216. p { b @login }
  217. p { a 'Continue', :href => R(Add) }
  218. end
  219.  
  220. def logout
  221. p "You have been logged out."
  222. p { a 'Continue', :href => R(Index) }
  223. end
  224.  
  225. def add
  226. if @user
  227. _form(@post, :action => R(Add))
  228. else
  229. _login
  230. end
  231. end
  232.  
  233. def edit
  234. if @user
  235. _form(@post, :action => R(Edit))
  236. else
  237. _login
  238. end
  239. end
  240.  
  241. def view
  242. _post(@post)
  243.  
  244. p "Comment for this post:"
  245. for c in @comments
  246. h1 c.username
  247. p c.body
  248. end
  249.  
  250. form :action => R(Comment), :method => 'post' do
  251. label 'Name', :for => 'post_username'; br
  252. input :name => 'post_username', :type => 'text'; br
  253. label 'Comment', :for => 'post_body'; br
  254. textarea :name => 'post_body' do; end; br
  255. input :type => 'hidden', :name => 'post_id', :value => @post.id
  256. input :type => 'submit'
  257. end
  258. end
  259.  
  260. # partials
  261. def _login
  262. form :action => R(Login), :method => 'post' do
  263. label 'Username', :for => 'username'; br
  264. input :name => 'username', :type => 'text'; br
  265.  
  266. label 'Password', :for => 'password'; br
  267. input :name => 'password', :type => 'text'; br
  268.  
  269. input :type => 'submit', :name => 'login', :value => 'Login'
  270. end
  271. end
  272.  
  273. def _post(post)
  274. h1 post.title
  275. p post.body
  276. p do
  277. [a("Edit", :href => R(Edit, post)), a("View", :href => R(View, post))].join " | "
  278. end
  279. end
  280.  
  281. def _form(post, opts)
  282. p { "You are logged in as #{@user.username} | #{a 'Logout', :href => R(Logout)}" }
  283. form({:method => 'post'}.merge(opts)) do
  284. label 'Title', :for => 'post_title'; br
  285. input :name => 'post_title', :type => 'text',
  286. :value => post.title; br
  287.  
  288. label 'Body', :for => 'post_body'; br
  289. textarea post.body, :name => 'post_body'; br
  290.  
  291. input :type => 'hidden', :name => 'post_id', :value => post.id
  292. input :type => 'submit'
  293. end
  294. end
  295. end
  296.  
  297. def Blog.create
  298. Camping::Models::Session.create_schema
  299. Blog::Models.create_schema :assume => (Blog::Models::Post.table_exists? ? 1.0 : 0.0)
  300. end
Add Comment
Please, Sign In to add comment