mta_json 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 %>
|