develop in rails & android & perl 30 pages
Post on 18-Jul-2015
260 Views
Preview:
TRANSCRIPT
Develop
in
Rails & Android & Perl
30 pages @sambaiz
NDS#39 Niigata.pm tech talk
@sambaiz
エアコンが壊れた
助けてRailsマン
Rails new
$ perl -e’sytem(“rails new nemui_man -T”)’
.gitignore
https://www.gitignore.io/
Test (今回は使ってないのもある)
group :development, :test do
gem 'rspec-rails', '~> 3.1.0'
gem "shoulda-matchers"
gem 'factory_girl_rails', '~> 4.4.1'
gem 'faker', '~> 1.4.3'
gem 'capybara', '~> 2.4.3'
gem 'poltergeist'
gem 'database_cleaner', '~> 1.3.0'
end
Install RSpec
$ perl -e‘system(“rails g rspec:install”)’
Config Rspec
#application.rb
config.generators do |g|
g.test_framework :rspec,
fixtures: true,
view_specs: false,
helper_specs: false,
routing_specs: false,
controller_specs: true,
request_specs: false
g.fixture_replacement :factory_girl, dir: 'spec/factories'
end
Config Poltergeist & FactoryGirl
# spec/rails_helper.rb
require 'capybara/poltergeist'
Capybara.javascript_driver = :poltergeist
RSpec.configure do |config|
config.include FactoryGirl::Syntax::Methods
end
Guard
group :development do
gem 'rb-fsevent', :require => false if RUBY_PLATFORM =~ /darwin/i
gem 'terminal-notifier-guard', '~> 1.6.1'
gem 'guard-livereload', require: false
gem 'guard-rubocop', require: false
gem 'guard-rspec', require: false
end
Gurad init
$ perl -e ‘system(“guard init livereload rubocop
rspec”)’
Grape micro-framework for creating REST-like APIs
gem 'grape'
gem 'grape-jbuilder' # 今回は使ってない
gem 'grape-swagger'
gem 'grape-swagger-rails'
Config grape
# routes.rb
mount API::Base => 'api'
mount GrapeSwaggerRails::Engine => '/apidoc'
# application.rb
config.paths.add File.join('app', 'api'), glob: File.join('**', '*.rb')
config.autoload_paths += Dir[Rails.root.join('app', 'api', '*')]
# initializers/grape_swagger_rails.rb
GrapeSwaggerRails.options.url = "api/swagger_doc.json"
GrapeSwaggerRails.options.app_name = 'SamuiNemui'
GrapeSwaggerRails.options.app_url = '/'
API Root
# app/api/app.rb
module API
class Base < Grape::API
mount API_V1::Base # バージョンを変えるときはここを切り替える
end
end
API V1
# app/api/api_v1.rb
module API_V1
class Base < Grape::API
mount V1::SamuiApi
mount V1::NemuiApi
add_swagger_documentation(
api_version: '1.0',
base_path: "/api",
hide_documentation_path: true
)
end
end
Samui API(0)
# app/api/v1/samui_api.rb
module V1
class SamuiApi < Grape::API
format :json
formatter :json, Grape::Formatter::Jbuilder
resource :samui do
# ここにいろいろ書く
end
end
Test(1-success) for Samui API
# spec/requests/v1/samui_spec.rb
require 'rails_helper.rb'
describe 'Samui API', type: :request do
it 'gets samui' do
attr = {
name: Faker::Name.name,
}
post '/api/samui', attr
expect(response).to be_success
end
end
Test(1-failure) for Samui API
it 'gets wrong samui' do
attr = {
name: nil
}
post '/api/samui', attr
expect(response).not_to be_success
end
Samui API(1)
resource :samui do
desc ‘さむい’
params do
requires :name, type: String, desc: ‘名前’
optional :hash, type: String, desc: ‘ハッシュ’
end
post do
# ここにいろいろ書くend
end
Test(2) for Samui API
it 'gets samui then return ganbare' do
attr = {
name: Faker::Name.name,
}
post '/api/samui', attr
expect(response).to be_success
json = JSON.parse(response.body)
expect(json['message']).to eq 'がんばれ'
end
Samui API(2)
post do
{ message: ‘がんばれ’ }
end
/apidoc
コード
https://github.com/sambaiz/nemui
ここからAndroidのはなし
最高のAPIができたのでAndroidから叩くはなし
Volley
https://android.googlesource.com/platform/fram
eworks/volley
TODO:
import module
module dependencyの設定
Request
queue=Volley.newRequestQueue(getApplicationContext());
queue.add(requestGanbare("https://nemui.herokuapp.com/
api/samui"));
Request Ganbare(1)
private void requestGanbare(String url){
StringRequest request = new StringRequest(Request.Method.POST, url, new
Response.Listener<String>() {
@Override
public void onResponse(String response) {
Ganbare gnb = JSON.decode(response, Ganbare.class); # POJOります
Toast.makeText(getApplication(), gnb.getMessage(), Toast.LENGTH_LONG).show();
}
},
new Response.ErrorListener() {
@Override public void onErrorResponse(VolleyError error) {
Toast.makeText(getApplication(), error.networkResponse.statusCode,
Toast.LENGTH_LONG).show();
}
})
Request Ganbare(2)
{
@Override
protected Map<String, String> getParams() {
Map<String, String> params = new HashMap<String, String>();
params.put("name", "hogehoge");
return params;
}
};
}
Ganbare Class
public class Ganbare {
private String message;
public Ganbare(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
}
30枚目
動作確認してないです!ありがとうございます!
top related