develop in rails & android & perl 30 pages

Post on 18-Jul-2015

260 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

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の設定

JSonic

http://jsonic.sourceforge.jp/

TODO:

jar -> /libs

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