mta_json 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +130 -0
- data/Rakefile +1 -0
- data/examples/crud/README.md +40 -0
- data/examples/crud/crud.lua +113 -0
- data/examples/crud/meta.xml +14 -0
- data/examples/crud/mta/crud/crud.lua +0 -0
- data/examples/crud/mta/crud/meta.xml +3 -0
- data/examples/crud/rails/.gitignore +15 -0
- data/examples/crud/rails/Gemfile +40 -0
- data/examples/crud/rails/Rakefile +7 -0
- data/examples/crud/rails/app/assets/images/rails.png +0 -0
- data/examples/crud/rails/app/assets/javascripts/application.js +15 -0
- data/examples/crud/rails/app/assets/javascripts/posts.js.coffee +3 -0
- data/examples/crud/rails/app/assets/stylesheets/application.css +13 -0
- data/examples/crud/rails/app/assets/stylesheets/posts.css.scss +3 -0
- data/examples/crud/rails/app/assets/stylesheets/scaffolds.css.scss +69 -0
- data/examples/crud/rails/app/controllers/application_controller.rb +3 -0
- data/examples/crud/rails/app/controllers/posts_controller.rb +83 -0
- data/examples/crud/rails/app/helpers/application_helper.rb +2 -0
- data/examples/crud/rails/app/helpers/posts_helper.rb +2 -0
- data/examples/crud/rails/app/mailers/.gitkeep +0 -0
- data/examples/crud/rails/app/models/.gitkeep +0 -0
- data/examples/crud/rails/app/models/post.rb +3 -0
- data/examples/crud/rails/app/views/layouts/application.html.erb +14 -0
- data/examples/crud/rails/app/views/posts/_form.html.erb +25 -0
- data/examples/crud/rails/app/views/posts/edit.html.erb +6 -0
- data/examples/crud/rails/app/views/posts/index.html.erb +25 -0
- data/examples/crud/rails/app/views/posts/new.html.erb +5 -0
- data/examples/crud/rails/app/views/posts/show.html.erb +15 -0
- data/examples/crud/rails/config/application.rb +64 -0
- data/examples/crud/rails/config/boot.rb +6 -0
- data/examples/crud/rails/config/database.yml +25 -0
- data/examples/crud/rails/config/environment.rb +5 -0
- data/examples/crud/rails/config/environments/development.rb +37 -0
- data/examples/crud/rails/config/environments/production.rb +67 -0
- data/examples/crud/rails/config/environments/test.rb +37 -0
- data/examples/crud/rails/config/initializers/backtrace_silencers.rb +7 -0
- data/examples/crud/rails/config/initializers/inflections.rb +15 -0
- data/examples/crud/rails/config/initializers/mime_types.rb +5 -0
- data/examples/crud/rails/config/initializers/secret_token.rb +7 -0
- data/examples/crud/rails/config/initializers/session_store.rb +8 -0
- data/examples/crud/rails/config/initializers/wrap_parameters.rb +14 -0
- data/examples/crud/rails/config/locales/en.yml +5 -0
- data/examples/crud/rails/config/routes.rb +61 -0
- data/examples/crud/rails/config.ru +4 -0
- data/examples/crud/rails/db/migrate/20130320115007_create_posts.rb +10 -0
- data/examples/crud/rails/db/schema.rb +23 -0
- data/examples/crud/rails/db/seeds.rb +7 -0
- data/examples/crud/rails/lib/assets/.gitkeep +0 -0
- data/examples/crud/rails/lib/tasks/.gitkeep +0 -0
- data/examples/crud/rails/log/.gitkeep +0 -0
- data/examples/crud/rails/public/404.html +26 -0
- data/examples/crud/rails/public/422.html +26 -0
- data/examples/crud/rails/public/500.html +25 -0
- data/examples/crud/rails/public/favicon.ico +0 -0
- data/examples/crud/rails/public/index.html +241 -0
- data/examples/crud/rails/public/robots.txt +5 -0
- data/examples/crud/rails/script/rails +6 -0
- data/examples/crud/rails/test/fixtures/.gitkeep +0 -0
- data/examples/crud/rails/test/fixtures/posts.yml +9 -0
- data/examples/crud/rails/test/functional/.gitkeep +0 -0
- data/examples/crud/rails/test/functional/posts_controller_test.rb +49 -0
- data/examples/crud/rails/test/integration/.gitkeep +0 -0
- data/examples/crud/rails/test/performance/browsing_test.rb +12 -0
- data/examples/crud/rails/test/test_helper.rb +13 -0
- data/examples/crud/rails/test/unit/.gitkeep +0 -0
- data/examples/crud/rails/test/unit/helpers/posts_helper_test.rb +4 -0
- data/examples/crud/rails/test/unit/post_test.rb +7 -0
- data/examples/crud/rails/vendor/assets/javascripts/.gitkeep +0 -0
- data/examples/crud/rails/vendor/assets/stylesheets/.gitkeep +0 -0
- data/examples/crud/rails/vendor/plugins/.gitkeep +0 -0
- data/lib/mta_json/version.rb +3 -0
- data/lib/mta_json/wrapper.rb +120 -0
- data/lib/mta_json.rb +6 -0
- data/mta_json.gemspec +23 -0
- metadata +226 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Marcus Bauer
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,130 @@
|
|
1
|
+
# mta_json
|
2
|
+
|
3
|
+
Wraps MTA:SA's JSON format to support named parameters and different HTTP
|
4
|
+
methods with callRemote.
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
Add this line to your application's Gemfile:
|
9
|
+
|
10
|
+
gem 'mta_json'
|
11
|
+
|
12
|
+
And then execute:
|
13
|
+
|
14
|
+
$ bundle
|
15
|
+
|
16
|
+
Or install it yourself as:
|
17
|
+
|
18
|
+
$ gem install mta_json
|
19
|
+
|
20
|
+
---
|
21
|
+
|
22
|
+
You'll need to add the following line to your `config/application.rb`:
|
23
|
+
|
24
|
+
config.middleware.insert_before Rack::MethodOverride, MtaJson::Wrapper
|
25
|
+
|
26
|
+
## Usage
|
27
|
+
|
28
|
+
### Rails
|
29
|
+
|
30
|
+
There are no changes required to any specific code, so long as your controller
|
31
|
+
actions respond to JSON and returns JSON.
|
32
|
+
|
33
|
+
The following would just work fine:
|
34
|
+
|
35
|
+
# route:
|
36
|
+
# resources :posts, :only => [:show, :index]
|
37
|
+
class PostsController < ApplicationController
|
38
|
+
def index
|
39
|
+
@posts = Post.all
|
40
|
+
|
41
|
+
respond_to do |format|
|
42
|
+
format.html
|
43
|
+
format.json { render :json => @posts }
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def show
|
48
|
+
@post = Post.find(params[:id])
|
49
|
+
|
50
|
+
respond_to do |format|
|
51
|
+
format.html
|
52
|
+
format.json { render :json => @post }
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
### MTA:SA
|
58
|
+
|
59
|
+
The basic parameters for callRemote are:
|
60
|
+
|
61
|
+
callRemote(url, your_function, params, options)
|
62
|
+
|
63
|
+
where
|
64
|
+
|
65
|
+
* **params** will be present as `params` hash in your application.
|
66
|
+
For example,
|
67
|
+
|
68
|
+
<pre>callRemote(url, your_function, { name = 'mabako', password = '****' })</pre>
|
69
|
+
|
70
|
+
will allow you to use `params[:name]` and `params[:password]`
|
71
|
+
|
72
|
+
* **options** contained options as hints to the JSON-Wrapper.
|
73
|
+
* **method** overwrites the default POST HTTP verb, only 'GET' is a valid
|
74
|
+
alternative currently.
|
75
|
+
|
76
|
+
The format is not `posts.json` for URLs but `posts.mta`. This gem will rewrite
|
77
|
+
the URL to be `posts.json` as well as handle MTA-specific code.
|
78
|
+
|
79
|
+
The following example code shows just how you'd retrieve the list of posts
|
80
|
+
returned by above Rails-specific example.
|
81
|
+
|
82
|
+
callRemote('http://localhost/posts.mta',
|
83
|
+
function(posts, err)
|
84
|
+
if posts ~= 'ERROR' then
|
85
|
+
outputDebugString('Retrieved ' .. #posts .. ' posts: ')
|
86
|
+
for k, post in ipairs(posts) do
|
87
|
+
-- assumes your @post in rails has a 'text' attribute
|
88
|
+
outputDebugString(post.text)
|
89
|
+
end
|
90
|
+
else
|
91
|
+
outputDebugString('Failed to retrieve blog posts, error: ' .. tostring(err), 2)
|
92
|
+
end
|
93
|
+
end,
|
94
|
+
nil, # no parameters to pass
|
95
|
+
{method = 'GET'} # MTA has POST as default, pick GET instead
|
96
|
+
)
|
97
|
+
|
98
|
+
Likewise to retrieve a single post:
|
99
|
+
|
100
|
+
callRemote('http://localhost/posts/1.mta',
|
101
|
+
function(post, err)
|
102
|
+
if post ~= 'ERROR' then
|
103
|
+
-- assumes your @post in rails has a 'text' attribute
|
104
|
+
outputDebugString(post.text)
|
105
|
+
else
|
106
|
+
outputDebugString('Failed to retrieve blog post, error: ' .. tostring(err), 2)
|
107
|
+
end
|
108
|
+
end,
|
109
|
+
nil,
|
110
|
+
{method = 'GET'}
|
111
|
+
)
|
112
|
+
|
113
|
+
A more complete example can be found in `examples/crud`.
|
114
|
+
|
115
|
+
## Contributing
|
116
|
+
|
117
|
+
1. Fork it
|
118
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
119
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
120
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
121
|
+
5. Create new Pull Request
|
122
|
+
|
123
|
+
## TODOs
|
124
|
+
|
125
|
+
* Special care should be taken with the default POST method, there currently is
|
126
|
+
no way to set a CSRF-Token. This can be worked around by using:
|
127
|
+
|
128
|
+
<pre>skip_before_filter :verify_authenticity_token, :only => :your_method</pre>
|
129
|
+
|
130
|
+
* The code doesn't insert itself as middleware automatically, see Installation section.
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# CRUD Example
|
2
|
+
(Create, Read, Update, Delete)
|
3
|
+
|
4
|
+
Tests whether you can create, read, update and delete posts from MTA
|
5
|
+
|
6
|
+
## Running the example
|
7
|
+
|
8
|
+
Start the rails server:
|
9
|
+
|
10
|
+
$ cd rails
|
11
|
+
$ rails s
|
12
|
+
|
13
|
+
Start the MTA Server and type the following commands:
|
14
|
+
|
15
|
+
$ aclrequest crud allow all
|
16
|
+
$ start crud
|
17
|
+
|
18
|
+
After that, the following commands are available within MTA (console, in-game)
|
19
|
+
|
20
|
+
* **/posts** - lists all posts
|
21
|
+
|
22
|
+
## How this was built - in rails
|
23
|
+
|
24
|
+
Creating the project:
|
25
|
+
|
26
|
+
$ rails new CrudTest
|
27
|
+
|
28
|
+
**Manually** adding "gem 'mta_json'" to the Gemfile.
|
29
|
+
|
30
|
+
Running Bundler:
|
31
|
+
|
32
|
+
$ bundle install
|
33
|
+
|
34
|
+
Generating a model Post along with a matching Controller:
|
35
|
+
|
36
|
+
$ rails g scaffold post title:string text:text
|
37
|
+
|
38
|
+
Migrates the database to include the new posts table:
|
39
|
+
|
40
|
+
$ rake db:migrate
|
@@ -0,0 +1,113 @@
|
|
1
|
+
-- lists the -id- and -title- of all posts. While there is a text attribute, we skip that
|
2
|
+
local url = 'http://localhost:3000/'
|
3
|
+
|
4
|
+
addCommandHandler('posts',
|
5
|
+
function(player, command)
|
6
|
+
callRemote(url .. 'posts.mta',
|
7
|
+
function(posts, err)
|
8
|
+
if posts ~= 'ERROR' then
|
9
|
+
output(player, #posts .. ' posts:')
|
10
|
+
for _, post in ipairs(posts) do
|
11
|
+
output(player, ' #' .. post.id .. ': ' .. tostring(post.title))
|
12
|
+
end
|
13
|
+
else
|
14
|
+
output(player, 'Failed to fetch posts')
|
15
|
+
end
|
16
|
+
end,
|
17
|
+
nil,
|
18
|
+
{ method = 'GET' }
|
19
|
+
)
|
20
|
+
end
|
21
|
+
)
|
22
|
+
|
23
|
+
addCommandHandler('post',
|
24
|
+
function(player, command, id)
|
25
|
+
if tonumber(id) then
|
26
|
+
callRemote(url .. 'posts/' .. math.floor(tonumber(id)) .. '.mta',
|
27
|
+
function(post, err)
|
28
|
+
if post ~= 'ERROR' then
|
29
|
+
output(player, 'Post #' .. post.id .. ': ' .. tostring(post.title))
|
30
|
+
-- first 60 characters only
|
31
|
+
output(player, tostring(post.text):sub(1, 60))
|
32
|
+
else
|
33
|
+
output(player, 'Failed to fetch post')
|
34
|
+
end
|
35
|
+
end,
|
36
|
+
nil,
|
37
|
+
{ method = 'GET'}
|
38
|
+
)
|
39
|
+
else
|
40
|
+
output(player, 'Missing id, /' .. command .. ' id')
|
41
|
+
end
|
42
|
+
end
|
43
|
+
)
|
44
|
+
|
45
|
+
addCommandHandler('newpost',
|
46
|
+
function(player, command, title, ...)
|
47
|
+
callRemote(url .. 'posts.mta',
|
48
|
+
function(post, err)
|
49
|
+
if post ~= 'ERROR' then
|
50
|
+
output(player, 'Created Post #' .. post.id .. ': ' .. tostring(post.title))
|
51
|
+
-- first 60 characters only
|
52
|
+
output(player, tostring(post.text):sub(1, 60))
|
53
|
+
|
54
|
+
-- rails sets the location like this:
|
55
|
+
-- format.json { render json: @post, status: :created, location: @post }
|
56
|
+
-- err contains our headers if no error was received.
|
57
|
+
output(player, 'URL: ' .. err['Location'])
|
58
|
+
else
|
59
|
+
output(player, 'Failed to create post')
|
60
|
+
end
|
61
|
+
end,
|
62
|
+
{ post = { title = title, text = table.concat({...}, ' ') } }
|
63
|
+
)
|
64
|
+
end
|
65
|
+
)
|
66
|
+
|
67
|
+
addCommandHandler('updatepost',
|
68
|
+
function(player, command, id, title, ...)
|
69
|
+
if tonumber(id) then
|
70
|
+
callRemote(url .. 'posts/' .. math.floor(tonumber(id)) .. '.mta',
|
71
|
+
function(post, err)
|
72
|
+
if post ~= 'ERROR' then
|
73
|
+
-- the controller generated by the default update has
|
74
|
+
-- head :no_content - which means both post and err will be empty.
|
75
|
+
output(player, 'Updated!')
|
76
|
+
else
|
77
|
+
output(player, 'Failed to update post')
|
78
|
+
end
|
79
|
+
end,
|
80
|
+
{ post = { title = title, text = table.concat({...}, ' ') } },
|
81
|
+
{ method = 'PUT' }
|
82
|
+
)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
)
|
86
|
+
|
87
|
+
addCommandHandler('delpost',
|
88
|
+
function(player, command, id)
|
89
|
+
if tonumber(id) then
|
90
|
+
callRemote(url .. 'posts/' .. math.floor(tonumber(id)) .. '.mta',
|
91
|
+
function(post, err)
|
92
|
+
if post ~= 'ERROR' then
|
93
|
+
-- the controller generated by the default update has
|
94
|
+
-- head :no_content - which means both post and err will be empty.
|
95
|
+
output(player, 'deleted!')
|
96
|
+
else
|
97
|
+
output(player, 'Failed to delete post')
|
98
|
+
end
|
99
|
+
end,
|
100
|
+
nil,
|
101
|
+
{ method = 'DELETE' }
|
102
|
+
)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
)
|
106
|
+
|
107
|
+
function output(element, text)
|
108
|
+
if getElementType(element) == 'console' then
|
109
|
+
outputServerLog(text)
|
110
|
+
else
|
111
|
+
outputChatBox(text, element)
|
112
|
+
end
|
113
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<!--
|
2
|
+
mta_json crud example to interact with rails.
|
3
|
+
|
4
|
+
See https://github.com/mabako/mta_json
|
5
|
+
-->
|
6
|
+
<meta>
|
7
|
+
<!-- Script source file -->
|
8
|
+
<script src="crud.lua"/>
|
9
|
+
|
10
|
+
<!-- This wouldn't make sense without callRemote, would it? -->
|
11
|
+
<aclrequest>
|
12
|
+
<right name="function.callRemote" access="true" />
|
13
|
+
</aclrequest>
|
14
|
+
</meta>
|
File without changes
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# See http://help.github.com/ignore-files/ for more about ignoring files.
|
2
|
+
#
|
3
|
+
# If you find yourself ignoring temporary files generated by your text editor
|
4
|
+
# or operating system, you probably want to add a global ignore instead:
|
5
|
+
# git config --global core.excludesfile ~/.gitignore_global
|
6
|
+
|
7
|
+
# Ignore bundler config
|
8
|
+
/.bundle
|
9
|
+
|
10
|
+
# Ignore the default SQLite database.
|
11
|
+
/db/*.sqlite3
|
12
|
+
|
13
|
+
# Ignore all logfiles and tempfiles.
|
14
|
+
/log/*.log
|
15
|
+
/tmp
|
@@ -0,0 +1,40 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
gem 'rails', '3.2.12'
|
4
|
+
|
5
|
+
# Bundle edge Rails instead:
|
6
|
+
# gem 'rails', :git => 'git://github.com/rails/rails.git'
|
7
|
+
|
8
|
+
gem 'sqlite3'
|
9
|
+
|
10
|
+
|
11
|
+
# Gems used only for assets and not required
|
12
|
+
# in production environments by default.
|
13
|
+
group :assets do
|
14
|
+
gem 'sass-rails', '~> 3.2.3'
|
15
|
+
gem 'coffee-rails', '~> 3.2.1'
|
16
|
+
|
17
|
+
# See https://github.com/sstephenson/execjs#readme for more supported runtimes
|
18
|
+
# gem 'therubyracer', :platforms => :ruby
|
19
|
+
|
20
|
+
gem 'uglifier', '>= 1.0.3'
|
21
|
+
end
|
22
|
+
|
23
|
+
gem 'jquery-rails'
|
24
|
+
|
25
|
+
# To use ActiveModel has_secure_password
|
26
|
+
# gem 'bcrypt-ruby', '~> 3.0.0'
|
27
|
+
|
28
|
+
# To use Jbuilder templates for JSON
|
29
|
+
# gem 'jbuilder'
|
30
|
+
|
31
|
+
# Use unicorn as the app server
|
32
|
+
# gem 'unicorn'
|
33
|
+
|
34
|
+
# Deploy with Capistrano
|
35
|
+
# gem 'capistrano'
|
36
|
+
|
37
|
+
# To use debugger
|
38
|
+
# gem 'debugger'
|
39
|
+
|
40
|
+
gem 'mta_json'
|
@@ -0,0 +1,7 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
# Add your own tasks in files placed in lib/tasks ending in .rake,
|
3
|
+
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
|
4
|
+
|
5
|
+
require File.expand_path('../config/application', __FILE__)
|
6
|
+
|
7
|
+
CrudTest::Application.load_tasks
|
Binary file
|
@@ -0,0 +1,15 @@
|
|
1
|
+
// This is a manifest file that'll be compiled into application.js, which will include all the files
|
2
|
+
// listed below.
|
3
|
+
//
|
4
|
+
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
|
5
|
+
// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
|
6
|
+
//
|
7
|
+
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
8
|
+
// the compiled file.
|
9
|
+
//
|
10
|
+
// WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
|
11
|
+
// GO AFTER THE REQUIRES BELOW.
|
12
|
+
//
|
13
|
+
//= require jquery
|
14
|
+
//= require jquery_ujs
|
15
|
+
//= require_tree .
|
@@ -0,0 +1,13 @@
|
|
1
|
+
/*
|
2
|
+
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
3
|
+
* listed below.
|
4
|
+
*
|
5
|
+
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
6
|
+
* or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
|
7
|
+
*
|
8
|
+
* You're free to add application-wide styles to this file and they'll appear at the top of the
|
9
|
+
* compiled file, but it's generally better to create a new file per style scope.
|
10
|
+
*
|
11
|
+
*= require_self
|
12
|
+
*= require_tree .
|
13
|
+
*/
|
@@ -0,0 +1,69 @@
|
|
1
|
+
body {
|
2
|
+
background-color: #fff;
|
3
|
+
color: #333;
|
4
|
+
font-family: verdana, arial, helvetica, sans-serif;
|
5
|
+
font-size: 13px;
|
6
|
+
line-height: 18px;
|
7
|
+
}
|
8
|
+
|
9
|
+
p, ol, ul, td {
|
10
|
+
font-family: verdana, arial, helvetica, sans-serif;
|
11
|
+
font-size: 13px;
|
12
|
+
line-height: 18px;
|
13
|
+
}
|
14
|
+
|
15
|
+
pre {
|
16
|
+
background-color: #eee;
|
17
|
+
padding: 10px;
|
18
|
+
font-size: 11px;
|
19
|
+
}
|
20
|
+
|
21
|
+
a {
|
22
|
+
color: #000;
|
23
|
+
&:visited {
|
24
|
+
color: #666;
|
25
|
+
}
|
26
|
+
&:hover {
|
27
|
+
color: #fff;
|
28
|
+
background-color: #000;
|
29
|
+
}
|
30
|
+
}
|
31
|
+
|
32
|
+
div {
|
33
|
+
&.field, &.actions {
|
34
|
+
margin-bottom: 10px;
|
35
|
+
}
|
36
|
+
}
|
37
|
+
|
38
|
+
#notice {
|
39
|
+
color: green;
|
40
|
+
}
|
41
|
+
|
42
|
+
.field_with_errors {
|
43
|
+
padding: 2px;
|
44
|
+
background-color: red;
|
45
|
+
display: table;
|
46
|
+
}
|
47
|
+
|
48
|
+
#error_explanation {
|
49
|
+
width: 450px;
|
50
|
+
border: 2px solid red;
|
51
|
+
padding: 7px;
|
52
|
+
padding-bottom: 0;
|
53
|
+
margin-bottom: 20px;
|
54
|
+
background-color: #f0f0f0;
|
55
|
+
h2 {
|
56
|
+
text-align: left;
|
57
|
+
font-weight: bold;
|
58
|
+
padding: 5px 5px 5px 15px;
|
59
|
+
font-size: 12px;
|
60
|
+
margin: -7px;
|
61
|
+
margin-bottom: 0px;
|
62
|
+
background-color: #c00;
|
63
|
+
color: #fff;
|
64
|
+
}
|
65
|
+
ul li {
|
66
|
+
font-size: 12px;
|
67
|
+
list-style: square;
|
68
|
+
}
|
69
|
+
}
|
@@ -0,0 +1,83 @@
|
|
1
|
+
class PostsController < ApplicationController
|
2
|
+
# GET /posts
|
3
|
+
# GET /posts.json
|
4
|
+
def index
|
5
|
+
@posts = Post.all
|
6
|
+
|
7
|
+
respond_to do |format|
|
8
|
+
format.html # index.html.erb
|
9
|
+
format.json { render json: @posts }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
# GET /posts/1
|
14
|
+
# GET /posts/1.json
|
15
|
+
def show
|
16
|
+
@post = Post.find(params[:id])
|
17
|
+
|
18
|
+
respond_to do |format|
|
19
|
+
format.html # show.html.erb
|
20
|
+
format.json { render json: @post }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# GET /posts/new
|
25
|
+
# GET /posts/new.json
|
26
|
+
def new
|
27
|
+
@post = Post.new
|
28
|
+
|
29
|
+
respond_to do |format|
|
30
|
+
format.html # new.html.erb
|
31
|
+
format.json { render json: @post }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# GET /posts/1/edit
|
36
|
+
def edit
|
37
|
+
@post = Post.find(params[:id])
|
38
|
+
end
|
39
|
+
|
40
|
+
# POST /posts
|
41
|
+
# POST /posts.json
|
42
|
+
def create
|
43
|
+
@post = Post.new(params[:post])
|
44
|
+
|
45
|
+
respond_to do |format|
|
46
|
+
if @post.save
|
47
|
+
format.html { redirect_to @post, notice: 'Post was successfully created.' }
|
48
|
+
format.json { render json: @post, status: :created, location: @post }
|
49
|
+
else
|
50
|
+
format.html { render action: "new" }
|
51
|
+
format.json { render json: @post.errors, status: :unprocessable_entity }
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# PUT /posts/1
|
57
|
+
# PUT /posts/1.json
|
58
|
+
def update
|
59
|
+
@post = Post.find(params[:id])
|
60
|
+
|
61
|
+
respond_to do |format|
|
62
|
+
if @post.update_attributes(params[:post])
|
63
|
+
format.html { redirect_to @post, notice: 'Post was successfully updated.' }
|
64
|
+
format.json { head :no_content }
|
65
|
+
else
|
66
|
+
format.html { render action: "edit" }
|
67
|
+
format.json { render json: @post.errors, status: :unprocessable_entity }
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
# DELETE /posts/1
|
73
|
+
# DELETE /posts/1.json
|
74
|
+
def destroy
|
75
|
+
@post = Post.find(params[:id])
|
76
|
+
@post.destroy
|
77
|
+
|
78
|
+
respond_to do |format|
|
79
|
+
format.html { redirect_to posts_url }
|
80
|
+
format.json { head :no_content }
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
File without changes
|
File without changes
|
@@ -0,0 +1,25 @@
|
|
1
|
+
<%= form_for(@post) do |f| %>
|
2
|
+
<% if @post.errors.any? %>
|
3
|
+
<div id="error_explanation">
|
4
|
+
<h2><%= pluralize(@post.errors.count, "error") %> prohibited this post from being saved:</h2>
|
5
|
+
|
6
|
+
<ul>
|
7
|
+
<% @post.errors.full_messages.each do |msg| %>
|
8
|
+
<li><%= msg %></li>
|
9
|
+
<% end %>
|
10
|
+
</ul>
|
11
|
+
</div>
|
12
|
+
<% end %>
|
13
|
+
|
14
|
+
<div class="field">
|
15
|
+
<%= f.label :title %><br />
|
16
|
+
<%= f.text_field :title %>
|
17
|
+
</div>
|
18
|
+
<div class="field">
|
19
|
+
<%= f.label :text %><br />
|
20
|
+
<%= f.text_area :text %>
|
21
|
+
</div>
|
22
|
+
<div class="actions">
|
23
|
+
<%= f.submit %>
|
24
|
+
</div>
|
25
|
+
<% end %>
|