{"id":7890,"date":"2017-07-03T01:08:00","date_gmt":"2017-07-02T16:08:00","guid":{"rendered":"http:\/\/www.webcyou.com\/?p=7890"},"modified":"2026-06-25T01:22:03","modified_gmt":"2026-06-24T16:22:03","slug":"rails5-angular-%e3%81%a7%e4%bd%9c%e3%82%8b%e3%80%82spa-%e4%bc%9a%e5%93%a1%e3%82%b5%e3%82%a4%e3%83%88%e3%81%ae%e4%bd%9c%e3%82%8a%e6%96%b9%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.webcyou.com\/?p=7890","title":{"rendered":"Rails5 + Angular \u3067\u4f5c\u308b\u3002SPA \u4f1a\u54e1\u30b5\u30a4\u30c8\u306e\u4f5c\u308a\u65b9\u3002"},"content":{"rendered":"<p>\u3069\u3082\u3067\u3059\u3002<\/p>\n<p>\u4eca\u56de\u3001\u67d4\u3089\u304b\u3081\u306e\u30bf\u30a4\u30c8\u30eb\u3067\u3059\u304c\u3001<\/p>\n<p>\u524d\u56de\u306e<\/p>\n<p class=\"entry_title\">\u300c<a href=\"https:\/\/www.webcyou.com\/?p=7816\">Rails5 API\u30e2\u30fc\u30c9 + Angular SPA\u74b0\u5883 \u7206\u901f\u69cb\u7bc9\u306e\u624b\u9806 \u305d\u306e1\u3002<\/a>\u300d<\/p>\n<p class=\"entry_title\">\u300c<a href=\"https:\/\/www.webcyou.com\/?p=7824\">Rails5 API\u30e2\u30fc\u30c9 + Angular SPA\u74b0\u5883 \u7206\u901f\u69cb\u7bc9\u306e\u624b\u9806 \u305d\u306e2\u3002<\/a>\u300d<\/p>\n<p>\u3053\u308c\u3089\u306a\u3069\u306e\u7d9a\u304d\u3068\u306a\u308a\u3001\u4eca\u56de\u306f\u3001 <strong>Devise Token Auth + angular2-token \u306b\u3088\u308b\u8a8d\u8a3c<\/strong>\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n<p>\uff08\u3061\u3087\u3063\u3068\u653e\u7f6e\u3057\u3066\u3044\u307e\u3057\u305f\u3002\u3002\u3002<\/p>\n<p>\u4ee5\u4e0b\u306f\u3001\u5404\u30e9\u30a4\u30d6\u30e9\u30ea\u306e <strong>github\u30ec\u30dd\u30b8\u30c8\u30ea<\/strong>\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n<p><strong>devise_token_auth<\/strong><\/p>\n<p><a href=\"https:\/\/github.com\/lynndylanhurley\/devise_token_auth\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/lynndylanhurley\/devise_token_auth<\/a><\/p>\n<p><strong>Devise Token Auth <\/strong>\u306b\u95a2\u3057\u3066\u306f\u3001\u524d\u56de\u306e\u8a18\u4e8b\u306e\u300c<a href=\"https:\/\/www.webcyou.com\/?p=7869\">Rails5 + devise token auth\u3067\u4f5c\u308b \u8a8d\u8a3cAPI<\/a>\u300d\u3067\u7d39\u4ecb\u3055\u305b\u3066\u3044\u305f\u3060\u304d\u307e\u3057\u305f\u306e\u3067\u3001\u53c2\u8003\u306b\u3057\u3066\u3044\u305f\u3060\u3051\u308c\u3070\u3068\u30fc\u3002<\/p>\n<p><strong>angular2-token<\/strong><\/p>\n<p><a href=\"https:\/\/github.com\/neroniaky\/angular2-token\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/neroniaky\/angular2-token<\/a><\/p>\n<h4>\u30c7\u30e2\u5b9f\u88c5<\/h4>\n<p>\u4eca\u56de\u306f\u3001 <strong>Devise Token Auth + angular2-token<\/strong>\u3092\u7528\u3044\u3066\u4f1a\u54e1\u767b\u9332\u3092\u4f5c\u3063\u3066\u884c\u304f\u306e\u3067\u3059\u304c\u3001\u4ee5\u4e0b\u306b\u30c7\u30e2\u30b5\u30f3\u30d7\u30eb\u304c\u7528\u610f\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<p><strong>angular2-token-example<\/strong><\/p>\n<p><a href=\"https:\/\/github.com\/neroniaky\/angular2-token-example\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/neroniaky\/angular2-token-example<\/a><\/p>\n<p>\u4eca\u56de\u306f\u3001\u3053\u3061\u3089\u306b\u3059\u3067\u306b\u30c7\u30e2\u5b9f\u88c5\u304c\u3042\u308a\u307e\u3057\u3066\u3001\u305d\u308c\u3092\u57fa\u306b\u5b9f\u969b\u306b\u624b\u3092\u52d5\u304b\u3057\u3066\u5b9f\u88c5\u3057\u3066\u89e3\u8aac\u3055\u305b\u3066\u9802\u3053\u3046\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n<p><a href=\"https:\/\/angular2-token.herokuapp.com\/#\/\" target=\"_blank\" rel=\"noopener\">https:\/\/angular2-token.herokuapp.com\/#\/<\/a><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-7921\" src=\"https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/06\/fcf92aa7a020cd4ca17999495acd2ff8.png\" alt=\"\" width=\"682\" height=\"458\" srcset=\"https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/06\/fcf92aa7a020cd4ca17999495acd2ff8.png 1199w, https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/06\/fcf92aa7a020cd4ca17999495acd2ff8-300x202.png 300w, https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/06\/fcf92aa7a020cd4ca17999495acd2ff8-768x516.png 768w, https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/06\/fcf92aa7a020cd4ca17999495acd2ff8-1024x688.png 1024w\" sizes=\"auto, (max-width: 682px) 100vw, 682px\" \/><\/p>\n<p>\u3069\u306e\u3088\u3046\u306a\u30c7\u30e2\u304b\u3068\u8a00\u3046\u3068\u3002<\/p>\n<p><strong>\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9<\/strong>\u3001<strong>\u30d1\u30b9\u30ef\u30fc\u30c9\u5165\u529b<\/strong>\u3001<strong>\u78ba\u8a8d\u5165\u529b<\/strong>\u3067\u3001<strong>\u30e6\u30fc\u30b6\u30fc\u767b\u9332<\/strong>\u3092\u884c\u3044\u3001<strong>\u30ed\u30b0\u30a4\u30f3<\/strong>\u3057\u305f\u308a\u3001<strong>\u60c5\u5831\u3092\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8<\/strong>\u3057\u305f\u308a\u3001<strong>\u30ed\u30b0\u30a2\u30a6\u30c8<\/strong>\u3057\u305f\u308a\u3068\u8a00\u3063\u305f\u3001 \u4e00\u901a\u308a\u306e\u3067\u3082\u30b5\u30f3\u30d7\u30eb\u304c\u5b9f\u88c5\u3055\u308c\u3066\u304a\u308a\u307e\u3059\u3002<\/p>\n<p>\u305d\u308c\u3067\u306f\u65e9\u901f\u3001git\u306ecommit\u3092\u57fa\u306b\u8efd\u304f\u8aac\u660e\u3055\u305b\u3066\u9802\u304d\u307e\u3059\u30fc\u3002<\/p>\n<h4>\u5b9f\u88c5<\/h4>\n<p>\u30ec\u30dd\u30b8\u30c8\u30ea\u306f\u3001\u4ee5\u4e0b\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n<p>\u524d\u56de\u3068\u306f\u5225\u306b\u65b0\u305f\u306b\u30d6\u30e9\u30f3\u30c1\u3092\u5207\u3063\u3066\u4f5c\u696d\u3092\u884c\u3063\u3066\u304a\u308a\u307e\u3059\u3002<\/p>\n<p>\u30d6\u30e9\u30f3\u30c1\u540d\u306f\u300c<strong>devise_token_auth<\/strong>\u300d\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n<p><strong>github<\/strong><\/p>\n<p><a href=\"https:\/\/github.com\/webcyou\/rails-api-angular-example\/tree\/devise_token_auth\" target=\"_blank\" rel=\"noopener\">rails-api-angular-example<\/a><\/p>\n<h5>\u8a2d\u5b9a<\/h5>\n<p><strong>github<\/strong><\/p>\n<p><a href=\"https:\/\/github.com\/webcyou\/rails-api-angular-example\/commit\/6190826068720489d91a38a8d17155d49c8863de\" target=\"_blank\" rel=\"noopener\">rails change db mysql &amp; devise_token_auth setup<\/a><\/p>\n<p>\u307e\u305a\u306f\u3001\u4f7f\u7528\u3059\u308b\u305d\u308c\u305e\u308c\u306egem\u3092\u8ffd\u52a0\u3002<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"ruby\">gem 'omniauth'\ngem 'devise_token_auth'\ngem 'omniauth-github'<\/pre>\n<p>CORS \uff08\u30af\u30ed\u30b9\u30c9\u30e1\u30a4\u30f3\uff09\u5bfe\u5fdc\u3059\u308b\u305f\u3081\u3001rack-cors\u3082\u4f7f\u7528\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"ruby\">gem 'rack-cors'<\/pre>\n<p>\u307e\u305f\u3001\u524d\u56de\u307e\u3067sqlite3\u3092\u4f7f\u7528\u3057\u3066\u3044\u305f\u306e\u3067\u3059\u304c\u3001mysql2\u306b\u5207\u308a\u66ff\u3048\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u8a2d\u5b9a\u3082\u5909\u66f4\u3057\u3066\u304a\u304d\u307e\u3059\u3002<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\">default: &amp;default\n  adapter: mysql2\n  encoding: utf8\n  pool: 5\n  username: root\n  password:\n  host: localhost\n\ndevelopment:\n  &lt;&lt;: *default\n  database: rails_api_angular_example<\/pre>\n<p>Gemfile\u3092\u66f4\u65b0\u3057\u305f\u3089\u3001\u300cbundle install\u300d\u3068\u5b9f\u884c\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\">$ bundle install --path vendor\/bundle<\/pre>\n<p><strong>app\/controllers\/application_controller.rb<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"ruby\">class ApplicationController &lt; ActionController::API\n  include DeviseTokenAuth::Concerns::SetUserByToken\nend<\/pre>\n<p>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u5168\u4f53\u3067\u4f7f\u7528\u3059\u308b<strong>ApplicationController<\/strong>\u306b\u3001 DeviseTokenAuth::Concerns::SetUserByToken \u3092 include\u5b9a\u7fa9\u3002<\/p>\n<p><strong>app\/controllers\/private_resource_controller.rb<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"ruby\">class PrivateResourceController &lt; ApplicationController\n\n    before_action :authenticate_user!\n\n    def index\n        response = {\n            data: 'Private Content for ' + current_user.email\n        }\n\n        render json: response\n    end\n\nend<\/pre>\n<p>\u524d\u56de\u306b\u3066\u4f7f\u7528\u3057\u3066\u3044\u305f\u3001\u300capp\/controllers\/users_controller.rb\u300d\u3092\u524a\u9664\u3057\u307e\u3059\u3002<\/p>\n<p><strong>app\/models\/user.rb<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\">$ rails g devise_token_auth:install User auth<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"ruby\">class User &lt; ActiveRecord::Base\n  # Include default devise modules.\n  devise :database_authenticatable, :registerable,\n         :rememberable, :trackable, :omniauthable,\n         :validatable #,:recoverable,:confirmable\n  include DeviseTokenAuth::Concerns::User\nend<\/pre>\n<p><strong>config\/routes.rb<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"ruby\">Rails.application.routes.draw do\n  mount_devise_token_auth_for 'User', at: 'auth'\n\n  resources :private_resource, only: :index\nend<\/pre>\n<p>migrate\u306e\u5dee\u5206\u3082\u51fa\u3066\u304a\u308a\u307e\u3059\u304c\u3001\u3053\u3061\u3089\u306f\u5272\u611b\u3055\u305b\u3066\u3044\u305f\u3060\u304d\u307e\u3059\u3002<\/p>\n<p><strong>github<\/strong><\/p>\n<p><a href=\"https:\/\/github.com\/webcyou\/rails-api-angular-example\/commit\/7a418e4419de160ec67ae88a8d881e5cb433c5dc\" target=\"_blank\" rel=\"noopener\">add angular2-token package<\/a><\/p>\n<p>angular2-token\u306epackage\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3002<\/p>\n<p><strong>github<\/strong><\/p>\n<p><a href=\"https:\/\/github.com\/webcyou\/rails-api-angular-example\/commit\/31f591970dfa0845f33f3d6c150d847ca1d3131a\" target=\"_blank\" rel=\"noopener\">delete user files<\/a><\/p>\n<p>\u524d\u56de\u307e\u3067\u4f7f\u7528\u3057\u3066\u3044\u305f\u300cuser\u300d\u307e\u308f\u308a\u306e\u30c7\u30fc\u30bf\u3092\u524a\u9664\u3002<\/p>\n<p><strong>github<\/strong><\/p>\n<p><a href=\"https:\/\/github.com\/webcyou\/rails-api-angular-example\/commit\/156c64f9b97d07c1d95fdada98fb7478aec711e9\" target=\"_blank\" rel=\"noopener\">refactor scss files &amp; add bootstrap<\/a><\/p>\n<p>bootstrap\u306ecss\u3084\u3001font-awesome\u306ecss\u3092\u8aad\u307f\u8fbc\u307f\u307e\u3059\u3002<\/p>\n<p><strong>github<\/strong><\/p>\n<p><a href=\"https:\/\/github.com\/webcyou\/rails-api-angular-example\/commit\/4dd796edffa5209759d6c1bcaea36805450ff63d\" target=\"_blank\" rel=\"noopener\">remove spec file<\/a><\/p>\n<p>\u3053\u3061\u3089\u3082\u524d\u56de\u307e\u3067\u3057\u3088\u3046\u3057\u3066\u3044\u305f Anglur\u306espec\u5468\u308a\u3092\u524a\u9664\u3057\u307e\u3059\u3002<\/p>\n<p><strong>github<\/strong><\/p>\n<p><a href=\"https:\/\/github.com\/webcyou\/rails-api-angular-example\/commit\/ba1d7f3398263dcd7c4c3fba3474bdb869a04e29\" target=\"_blank\" rel=\"noopener\">template init<\/a><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-7892\" src=\"https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/05\/1c942a81699721c17828ecd207ebc793.png\" alt=\"\" width=\"538\" height=\"151\" srcset=\"https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/05\/1c942a81699721c17828ecd207ebc793.png 674w, https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/05\/1c942a81699721c17828ecd207ebc793-300x84.png 300w\" sizes=\"auto, (max-width: 538px) 100vw, 538px\" \/><\/p>\n<p>app-routing.module.ts \u3092\u524a\u9664\u3057\u3001\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e app.component.html \u3092\u4fee\u6b63\u3002<\/p>\n<p><strong>app.component.ts<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"typescript\">import { Component, ViewEncapsulation, OnInit } from '@angular\/core';\nimport { Angular2TokenService } from 'angular2-token';\n\nexport class AppComponent {\n  title = 'app works!';\n  constructor(private _tokenService: Angular2TokenService) {\n    this._tokenService.init();\n  }\n}<\/pre>\n<p><strong>app.module.ts<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"typescript\">import { Angular2TokenService, A2tUiModule } from 'angular2-token';\nimport { AppComponent } from '.\/app.component';\n\nimport {\n  routes\n} from '.\/';\n\n@NgModule({\n  imports: [\n    routes,\n    BrowserModule,\n    HttpModule,\n    A2tUiModule\n  ],\n  providers: [\n    Angular2TokenService\n  ],\n  declarations: [ AppComponent ],\n  bootstrap: [AppComponent]\n})\nexport class AppModule { }<\/pre>\n<p><strong>app.routes.ts<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"typescript\">import { RouterModule, Routes } from '@angular\/router';\n\nimport { Angular2TokenService } from 'angular2-token';\n\nconst routerConfig: Routes = [\n];\n\nexport const routes = RouterModule.forRoot(routerConfig, { useHash: true });<\/pre>\n<p>tokenService\u306e\u4e2d\u8eab\u3092\u78ba\u8a8d\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"typescript\">constructor(public tokenService: Angular2TokenService) {\n}\nconsole.log(tokenService);<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\">activatedRoute: ActivatedRoute\natOptions: Object\ncurrentAuthData: (...)\ncurrentAuthHeaders: (...)\ncurrentUserData: (...)\ncurrentUserType: (...)\nhttp: Http\nrouter: Router<\/pre>\n<p><strong>index.ts<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"typescript\">export * from '.\/app.routes';\nexport * from '.\/app.component';\nexport * from '.\/app.module';<\/pre>\n<p>\u6700\u8fd1\u3001\u79c1\u3082\u3001\u3082\u3063\u3071\u3089\u3053\u306e\u8a18\u8ff0\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u7d30\u5206\u5316\u3092\u884c\u3046\u307b\u3069\u3001\u5927\u91cf\u306b\u767a\u751f\u3057\u3066\u3057\u307e\u3046 component\u5468\u308a\u3002<\/p>\n<p>component\u540c\u58eb\u3067 import\u3057\u3066\u4e71\u96d1\u306b\u306a\u3089\u306a\u3044\u69d8\u306b\u3001\u3068\u308a\u3042\u3048\u305a index.ts\u3092\u30a8\u30f3\u30c8\u30ea\u30fc\u30dd\u30a4\u30f3\u30c8\u3057\u3066\u7f6e\u304f\u30eb\u30fc\u30eb\u904b\u7528\u3059\u308c\u3070\u3042\u308b\u7a0b\u5ea6\u7cbe\u67fb\u3055\u308c\u3066\u306f\u3044\u304d\u307e\u3059\u3002<\/p>\n<p><strong>github<\/strong><\/p>\n<p><a href=\"https:\/\/github.com\/webcyou\/rails-api-angular-example\/commit\/dd76761872062d75df6f28fa2193c9c2ff7c65c9\" target=\"_blank\" rel=\"noopener\">add example<\/a><\/p>\n<p><strong>app.module.ts<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"typescript\">import { BrowserModule } from '@angular\/platform-browser';\nimport { NgModule } from '@angular\/core';\nimport { FormsModule } from '@angular\/forms';\nimport { HttpModule } from '@angular\/http';\n\nimport { Angular2TokenService, A2tUiModule } from 'angular2-token';\n\nimport {\n  AppComponent,\n  ExampleModule,\n  routes\n} from '.\/';\n\n@NgModule({\n  imports: [\n    routes,\n    BrowserModule,\n    HttpModule,\n    ExampleModule,\n    A2tUiModule\n  ],\n  providers: [\n    Angular2TokenService\n  ],\n  declarations: [ AppComponent ],\n  bootstrap: [AppComponent]\n})\nexport class AppModule { }<\/pre>\n<p><strong>app.routes.ts<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"typescript\">import { RouterModule, Routes } from '@angular\/router';\n\nimport {\n  ExampleComponent\n} from '.\/';\n\nimport { Angular2TokenService } from 'angular2-token';\n\nconst routerConfig: Routes = [\n  { path: '', component: ExampleComponent }\n];\n\nexport const routes = RouterModule.forRoot(routerConfig, { useHash: true });<\/pre>\n<p><strong>example.component.ts<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"typescript\">import { Component, OnInit } from '@angular\/core';\nimport { Angular2TokenService } from 'angular2-token';\n\n@Component({\n  selector: 'example',\n  templateUrl: 'example.component.html',\n  styleUrls: ['example.component.scss']\n})\nexport class ExampleComponent {\n  constructor(public tokenService: Angular2TokenService) {\n    this.tokenService.init();\n  }\n}<\/pre>\n<p><strong>example.module.ts<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"typescript\">import { NgModule } from '@angular\/core';\nimport { FormsModule } from '@angular\/forms';\nimport { CommonModule } from '@angular\/common';\nimport { HttpModule } from '@angular\/http';\nimport { RouterModule } from '@angular\/router';\n\nimport {\n  ExampleComponent,\n} from '.\/';\n\n@NgModule({\n  imports: [\n    CommonModule,\n    FormsModule,\n    RouterModule\n  ],\n  declarations: [\n    ExampleComponent,\n  ],\n  exports: [\n    ExampleComponent\n  ]\n})\nexport class ExampleModule { }<\/pre>\n<p><strong>example\/index.ts<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"typescript\">export * from '.\/example.component';\nexport * from '.\/example.module';<\/pre>\n<p><strong>index.ts<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"typescript\">export * from '.\/example';\nexport * from '.\/app.routes';\nexport * from '.\/app.component';\nexport * from '.\/app.module';<\/pre>\n<p><strong>github<\/strong><\/p>\n<p><a href=\"https:\/\/github.com\/webcyou\/rails-api-angular-example\/commit\/4c43dee8426c61970a535a414d9e5f764b2e2d43\" target=\"_blank\" rel=\"noopener\">add Current User Status<\/a><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-7893\" src=\"https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/05\/abe4e898a0e5341dd81d5400c01227a6.png\" alt=\"\" width=\"556\" height=\"102\" srcset=\"https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/05\/abe4e898a0e5341dd81d5400c01227a6.png 964w, https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/05\/abe4e898a0e5341dd81d5400c01227a6-300x55.png 300w, https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/05\/abe4e898a0e5341dd81d5400c01227a6-768x141.png 768w\" sizes=\"auto, (max-width: 556px) 100vw, 556px\" \/><\/p>\n<p>\u73fe\u5728\u306e\u30e6\u30fc\u30b6\u30fc\u60c5\u5831\u306e\u8868\u793a<\/p>\n<p>\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n<p><strong>github<\/strong><\/p>\n<p><a href=\"https:\/\/github.com\/webcyou\/rails-api-angular-example\/commit\/f5f687d11da715217c78a3f8e3c33a4f5ef200a6\" target=\"_blank\" rel=\"noopener\">add shared files<\/a><\/p>\n<p>OutputComponent \u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002<\/p>\n<p><strong>shared\/index.ts<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"typescript\">export * from '.\/shared';<\/pre>\n<p><strong>github<\/strong><\/p>\n<p><a href=\"https:\/\/github.com\/webcyou\/rails-api-angular-example\/commit\/c21cc1416156acc004a373c5926efecd39b9fa5f\" target=\"_blank\" rel=\"noopener\">add register files<\/a><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-7895\" src=\"https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/05\/f9a73b5a87e535adf993d4491402ef90.png\" alt=\"\" width=\"734\" height=\"254\" srcset=\"https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/05\/f9a73b5a87e535adf993d4491402ef90.png 1143w, https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/05\/f9a73b5a87e535adf993d4491402ef90-300x104.png 300w, https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/05\/f9a73b5a87e535adf993d4491402ef90-768x266.png 768w, https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/05\/f9a73b5a87e535adf993d4491402ef90-1024x355.png 1024w\" sizes=\"auto, (max-width: 734px) 100vw, 734px\" \/><\/p>\n<p>example.component.html \u306b register \u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"html\"><\/pre>\n<p><strong>register.component.html<\/strong><\/p>\n<div class=\"col-md-6\">\n<div class=\"card card-block\">\n<h4 class=\"card-title\">Register<\/h4>\n<form>\n<div class=\"form-group\"><label for=\"formGroupExampleInput\">Email<\/label> <input class=\"form-control\" name=\"email\" required=\"\" type=\"text\" placeholder=\"Email\" \/><\/div>\n<div class=\"form-group\"><label for=\"formGroupExampleInput\">Password<\/label> <input class=\"form-control\" name=\"password\" required=\"\" type=\"password\" placeholder=\"Password\" \/><\/div>\n<div class=\"form-group\"><label for=\"formGroupExampleInput\">Password Confirmation<\/label> <input class=\"form-control\" name=\"passwordConfirmation\" required=\"\" type=\"password\" placeholder=\"Password Confirmation\" \/><\/div>\n<p><button class=\"btn btn-primary\" disabled=\"disabled\" form=\"\" type=\"submit\">Register<\/button><\/form>\n<\/div>\n<\/div>\n<div class=\"col-md-6\"><\/div>\n<p><strong>example\/index.ts<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"typescript\">export * from '.\/register';<\/pre>\n<p><strong>register\/index.ts<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"typescript\">export * from '.\/register.component';<\/pre>\n<p><strong>register.component.ts<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"typescript\">import { Component, OnInit } from '@angular\/core';\nimport { Angular2TokenService, RegisterData } from 'angular2-token';\n\n@Component({\n  selector: 'register',\n  templateUrl: 'register.component.html',\n  styleUrls: ['register.component.scss']\n})\nexport class RegisterComponent {\n\n  registerData: RegisterData = {};\n  output: any;\n\n  constructor(private _tokenService: Angular2TokenService) { }\n\n  \/\/ Submit Data to Backend\n  onSubmit() {\n\n    this.output = null;\n\n    this._tokenService.registerAccount(this.registerData).subscribe(\n      res =&gt; {\n        this.registerData = {};\n        this.output = res;\n      }, error =&gt; {\n        this.registerData = {};\n        this.output = error;\n      }\n    );\n  }\n}<\/pre>\n<p><strong>github<\/strong><\/p>\n<p><a href=\"https:\/\/github.com\/webcyou\/rails-api-angular-example\/commit\/ca9f400395b4a5ba66f2ea2115b5f516cf64cc46\" target=\"_blank\" rel=\"noopener\">add sign-in files<\/a><\/p>\n<p>\u4e00\u5ea6\u30ed\u30b0\u30a2\u30a6\u30c8<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-7896\" src=\"https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/05\/54baf6f07049a2dd5e6195d2796c6b2f.png\" alt=\"\" width=\"199\" height=\"161\" \/><\/p>\n<p>example.component.html \u306b sign-in \u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"html\"><\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-7897\" src=\"https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/05\/8917cd70afce0a3bd59354ee195fd855.png\" alt=\"\" width=\"1150\" height=\"316\" srcset=\"https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/05\/8917cd70afce0a3bd59354ee195fd855.png 1150w, https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/05\/8917cd70afce0a3bd59354ee195fd855-300x82.png 300w, https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/05\/8917cd70afce0a3bd59354ee195fd855-768x211.png 768w, https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/05\/8917cd70afce0a3bd59354ee195fd855-1024x281.png 1024w\" sizes=\"auto, (max-width: 1150px) 100vw, 1150px\" \/><\/p>\n<p><strong>example\/index.ts<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"typescript\">export * from '.\/sign-in';<\/pre>\n<p><strong>sign-in\/index.ts<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"typescript\">export * from '.\/sign-in.component';<\/pre>\n<p>sign-in.component.html \u3068 sign-in.component.ts \u306e\u5b9f\u88c5\u306f\u3001\u4ee5\u4e0b\u306e\u30b3\u30df\u30c3\u30c8\u3092\u53c2\u7167\u304f\u3060\u3055\u3044\u3002<\/p>\n<p><a href=\"https:\/\/github.com\/webcyou\/rails-api-angular-example\/commit\/ca9f400395b4a5ba66f2ea2115b5f516cf64cc46#diff-46326d12261526f3aa754ae23a0b19c9\" target=\"_blank\" rel=\"noopener\">\/sign-in\/sign-in.component.html<\/a><\/p>\n<p><a href=\"https:\/\/github.com\/webcyou\/rails-api-angular-example\/commit\/ca9f400395b4a5ba66f2ea2115b5f516cf64cc46#diff-c4d784b9997892875520a911e118fd28\" target=\"_blank\" rel=\"noopener\">\/sign-in\/sign-in.component.ts<\/a><\/p>\n<p><strong>github<\/strong><\/p>\n<p><a href=\"https:\/\/github.com\/webcyou\/rails-api-angular-example\/commit\/8f1499beef0670c0479b03a99c3e3f9dd15af00a\" target=\"_blank\" rel=\"noopener\">add sign-in-oauth files<\/a><\/p>\n<p><strong>github<\/strong><\/p>\n<p><a href=\"https:\/\/github.com\/webcyou\/rails-api-angular-example\/commit\/c539f004aab8fb4c56b3dfa3efab230856b81aff\" target=\"_blank\" rel=\"noopener\">add config omniauth.rb<\/a><\/p>\n<p><strong>github<\/strong><\/p>\n<p><a href=\"https:\/\/github.com\/webcyou\/rails-api-angular-example\/commit\/89e70b7d169ce9ff33082c22b46c0293c5119e88\" target=\"_blank\" rel=\"noopener\">add access-resource<\/a><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-7900\" src=\"https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/05\/652c6506908f061a1d92eaf280db319a.png\" alt=\"\" width=\"577\" height=\"207\" srcset=\"https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/05\/652c6506908f061a1d92eaf280db319a.png 577w, https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/05\/652c6506908f061a1d92eaf280db319a-300x108.png 300w\" sizes=\"auto, (max-width: 577px) 100vw, 577px\" \/><\/p>\n<p><strong>github<\/strong><\/p>\n<p><a href=\"https:\/\/github.com\/webcyou\/rails-api-angular-example\/commit\/d29cd773513ae06ce4933890e6fa25ba0be8cc4b\" target=\"_blank\" rel=\"noopener\">add change-password<\/a><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-7898\" src=\"https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/05\/3cfc0bf99f79d7926a2bf6d5ebca6ed3.png\" alt=\"\" width=\"1164\" height=\"402\" srcset=\"https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/05\/3cfc0bf99f79d7926a2bf6d5ebca6ed3.png 1164w, https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/05\/3cfc0bf99f79d7926a2bf6d5ebca6ed3-300x104.png 300w, https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/05\/3cfc0bf99f79d7926a2bf6d5ebca6ed3-768x265.png 768w, https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/05\/3cfc0bf99f79d7926a2bf6d5ebca6ed3-1024x354.png 1024w\" sizes=\"auto, (max-width: 1164px) 100vw, 1164px\" \/><\/p>\n<p><strong>github<\/strong><\/p>\n<p><a href=\"https:\/\/github.com\/webcyou\/rails-api-angular-example\/commit\/790b7874fb4a125863ef281bb454d0c9e123cbde\" target=\"_blank\" rel=\"noopener\">add validate-token<\/a><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-7901\" src=\"https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/05\/8c47cc3f4f40edcf2593793355575d0e.png\" alt=\"\" width=\"567\" height=\"275\" srcset=\"https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/05\/8c47cc3f4f40edcf2593793355575d0e.png 567w, https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/05\/8c47cc3f4f40edcf2593793355575d0e-300x146.png 300w\" sizes=\"auto, (max-width: 567px) 100vw, 567px\" \/><\/p>\n<p><strong>github<\/strong><\/p>\n<p><a href=\"https:\/\/github.com\/webcyou\/rails-api-angular-example\/commit\/31526ea0b0d3d892133d56180204c786972d4218\" target=\"_blank\" rel=\"noopener\">add sign-out<\/a><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-7896\" src=\"https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/05\/54baf6f07049a2dd5e6195d2796c6b2f.png\" alt=\"\" width=\"199\" height=\"161\" \/><\/p>\n<p><strong>github<\/strong><\/p>\n<p><a href=\"https:\/\/github.com\/webcyou\/rails-api-angular-example\/commit\/dc0b33ee7b92e223256664e595bcfc51038fc762\" target=\"_blank\" rel=\"noopener\">add restricted component<\/a><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-7899\" src=\"https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/05\/2e63617b798af93d96f5df2e84344a1d.png\" alt=\"\" width=\"413\" height=\"233\" srcset=\"https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/05\/2e63617b798af93d96f5df2e84344a1d.png 413w, https:\/\/www.webcyou.com\/wp-content\/uploads\/2017\/05\/2e63617b798af93d96f5df2e84344a1d-300x169.png 300w\" sizes=\"auto, (max-width: 413px) 100vw, 413px\" \/><\/p>\n<p><strong>\u30c7\u30e2URL<\/strong><\/p>\n<p><a href=\"https:\/\/angular2-token.herokuapp.com\/#\/\">https:\/\/angular2-token.herokuapp.com\/#\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u3069\u3082\u3067\u3059\u3002 \u4eca\u56de\u3001\u67d4\u3089\u304b\u3081\u306e\u30bf\u30a4\u30c8\u30eb\u3067\u3059\u304c\u3001 \u524d\u56de\u306e \u300cRails5 API\u30e2\u30fc\u30c9 + Angular SPA\u74b0\u5883 \u7206\u901f\u69cb\u7bc9\u306e\u624b\u9806 \u305d\u306e1\u3002\u300d \u300cRails5 API\u30e2\u30fc\u30c9 + Angular SPA\u74b0\u5883 \u7206\u901f\u69cb\u7bc9\u306e\u624b\u9806 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[203],"tags":[177,168,176,40,166,37,179,50,180,44,45,95,39,178,138,78,114,118],"class_list":{"0":"post-7890","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"hentry","6":"category-angular2","7":"tag-css3","8":"tag-html","9":"tag-html5","10":"tag-ios-sdk","11":"tag-iphone","12":"tag-iphone-","13":"tag-jquery","14":"tag-jquery-mobile","15":"tag-mysql","16":"tag-web","18":"tag-95","19":"tag-39","20":"tag-178","21":"tag-138","22":"tag-78","23":"tag-114","24":"tag-118"},"_links":{"self":[{"href":"https:\/\/www.webcyou.com\/index.php?rest_route=\/wp\/v2\/posts\/7890","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.webcyou.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.webcyou.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.webcyou.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webcyou.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=7890"}],"version-history":[{"count":21,"href":"https:\/\/www.webcyou.com\/index.php?rest_route=\/wp\/v2\/posts\/7890\/revisions"}],"predecessor-version":[{"id":12712,"href":"https:\/\/www.webcyou.com\/index.php?rest_route=\/wp\/v2\/posts\/7890\/revisions\/12712"}],"wp:attachment":[{"href":"https:\/\/www.webcyou.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=7890"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webcyou.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=7890"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webcyou.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=7890"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}