{"id":1083,"date":"2015-08-01T02:16:34","date_gmt":"2015-08-01T02:16:34","guid":{"rendered":"http:\/\/www.honobono-life.info\/wpeng\/?p=1083"},"modified":"2015-08-01T02:16:34","modified_gmt":"2015-08-01T02:16:34","slug":"user-signup-with-angularjs","status":"publish","type":"post","link":"http:\/\/www.honobono-life.info\/wpeng\/user-signup-with-angularjs\/","title":{"rendered":"Ruby on Rails Tutorial user signup with AngularJS"},"content":{"rendered":"<p><strong>(1)Adding a secure password<\/strong><\/p>\r\n\r\n<p><strong>1)configuration<\/strong><\/p>\r\n\r\n<p><strong>1.bcrypt-ruby install<\/strong><\/p>\r\n\r\n<p>$ vi Gemfile<\/p>\r\n\r\n<p>gem &#39;bcrypt&#39;<\/p>\r\n\r\n<p>$ bundle install<\/p>\r\n\r\n<p><strong>2.add &quot;password_digest&quot; columns to the users table<\/strong><\/p>\r\n\r\n<p>$ rails generate migration add_password_digest_to_users password_digest:string<br \/>\r\n&nbsp; &nbsp; &nbsp; invoke &nbsp;active_record<br \/>\r\n&nbsp; &nbsp; &nbsp; create &nbsp; &nbsp;db\/migrate\/20150713044621_add_password_digest_to_users.rb<\/p>\r\n\r\n<p>$ more db\/migrate\/20150713044621_add_password_digest_to_users.rb<\/p>\r\n\r\n<pre class=\"prettyprint\">\r\nclass AddPasswordDigestToUsers &lt; ActiveRecord::Migration\r\n  def change\r\n    add_column :users, :password_digest, :string\r\n  end\r\nend<\/pre>\r\n\r\n<p><strong>3.migration<\/strong><\/p>\r\n\r\n<p>$ bundle exec rake db:migrate<\/p>\r\n\r\n<p><strong>4.User model &quot;has_secure_password&quot; method<\/strong><\/p>\r\n\r\n<p>$ vi app\/models\/user.rb<\/p>\r\n\r\n<pre class=\"prettyprint\">\r\nclass User &lt; ActiveRecord::Base\r\n  has_secure_password\r\nend<\/pre>\r\n\r\n<p><strong>2)create test users<\/strong><\/p>\r\n\r\n<p>$ vi rails c<\/p>\r\n\r\n<p>2.0.0p247 :004 &gt; test = User.create(name: &quot;testuser4&quot;, email: &quot;test4@example.com&quot;, password: &quot;test4pass&quot;, password_confirmation: &quot;test4pass&quot;)<br \/>\r\n&nbsp;=&gt; #&lt;User id: 4, name: &quot;testuser4&quot;, email: &quot;test4@example.com&quot;, created_at: &quot;2015-07-13 04:51:06&quot;, updated_at: &quot;2015-07-13 04:51:06&quot;, password_digest: &quot;$2a$&#8230;&quot;&gt;<\/p>\r\n\r\n<p><strong>(2)AngularJS Signup form<\/strong><\/p>\r\n\r\n<p><strong>1)AngularJS route<\/strong><\/p>\r\n\r\n<p>$ vi app\/assets\/javascripts\/mymodule.js.erb<\/p>\r\n\r\n<pre class=\"prettyprint\">\r\nmyModule = angular.module(&#39;myModule&#39;, [&#39;ui.bootstrap&#39;,&#39;ngRoute&#39;,&#39;ngResource&#39;]);\r\n\r\nmyModule.config(function($routeProvider, $locationProvider) {\r\n  $locationProvider.html5Mode(true);\r\n  $routeProvider\r\n.......\r\n    .when(&quot;\/users\/new&quot;, {\r\n     templateUrl: &quot;&lt;%= asset_path(&#39;users\/new.html.erb&#39;) %&gt;&quot;\r\n     })\r\n<\/pre>\r\n\r\n<p><strong>2)AngularJS template new view<\/strong><\/p>\r\n\r\n<p>$ vi app\/assets\/templates\/users\/new.html.erb<\/p>\r\n\r\n<pre class=\"prettyprint\">\r\n&lt;div ng-controller=&quot;UsersNewCtrl&quot; class=&quot;row&quot;&gt;\r\n  &lt;div class=&quot;col-md-6 col-md-offset-3&quot;&gt;\r\n    &lt;h1 class=&quot;text-center&quot;&gt;Sign up&lt;\/h1&gt;\r\n    &lt;form name=&quot;userNewForm&quot; novalidate&gt;\r\n      &lt;div class=&quot;well&quot;&gt;\r\n        &lt;div class=&quot;form-group&quot;&gt;\r\n          &lt;label&gt;name&lt;\/label&gt;\r\n          &lt;input name=&quot;name&quot; class=&quot;form-control&quot;\r\n            ng-model=&quot;user.name&quot; required \/&gt;\r\n        &lt;\/div&gt;\r\n        &lt;div class=&quot;form-group&quot;&gt;\r\n          &lt;label&gt;email&lt;\/label&gt;\r\n          &lt;input type=&quot;email&quot; name=&quot;email&quot; class=&quot;form-control&quot;\r\n            ng-model=&quot;user.email&quot; required \/&gt;\r\n        &lt;\/div&gt;\r\n        &lt;div class=&quot;form-group&quot;&gt;\r\n          &lt;label&gt;password&lt;\/label&gt;\r\n          &lt;input type=&quot;password&quot; name=&quot;password&quot; class=&quot;form-control&quot;\r\n            ng-model=&quot;user.password&quot; required \/&gt;\r\n          &lt;\/div&gt;\r\n        &lt;div class=&quot;form-group&quot;&gt;\r\n          &lt;label&gt;password_confirmation&lt;\/label&gt;\r\n            &lt;input type=&quot;password&quot; name=&quot;password_confirmation&quot; \r\n              class=&quot;form-control&quot;\r\n              ng-model=&quot;user.password_confirmation&quot; required \/&gt;\r\n        &lt;\/div&gt;\r\n        &lt;button ng-click=&quot;submit()&quot; class=&quot;btn btn-primary&quot;&gt;\r\n          Create my account\r\n        &lt;\/button&gt;\r\n      &lt;\/div&gt;\r\n    &lt;\/form&gt;\r\n  &lt;\/div&gt;\r\n&lt;\/div&gt;\r\n<\/pre>\r\n\r\n<p><strong>3)AngularJS controller &quot;UsersNewCtrl&quot;<\/strong><\/p>\r\n\r\n<p>$ vi app\/assets\/javascripts\/mymodule.js.erb<\/p>\r\n\r\n<pre class=\"prettyprint\">\r\nmyModule.controller(&quot;UsersNewCtrl&quot;, function($scope, userResource) {\r\n  $scope.user = new userResource();\r\n});\r\n<\/pre>\r\n\r\n<p><strong>4)add a link to home view<\/strong><\/p>\r\n\r\n<p>$ vi app\/assets\/templates\/static_pages\/home.html.erb<\/p>\r\n\r\n<pre class=\"prettyprint\">\r\n&lt;p class=&quot;text-center&quot;&gt;\r\n  &lt;a class=&quot;btn btn-large btn-primary&quot; href=&quot;\/users\/new&quot;&gt;Sign up now!&lt;\/a&gt;\r\n&lt;\/p&gt;<\/pre>\r\n\r\n<p><strong>(3)AngularJS $resource POST<\/strong><\/p>\r\n\r\n<p><strong>1)AngularJS $resource POST<\/strong><\/p>\r\n\r\n<p>$ vi app\/assets\/javascripts\/mymodule.js.erb<\/p>\r\n\r\n<pre class=\"prettyprint\">\r\nmyModule.factory(&quot;userResource&quot;, function($resource) {\r\n  return $resource(&quot;\/app\/users\/:id&quot;, { id: &quot;@id&quot; },\r\n    {\r\n      &#39;create&#39;:  { method: &#39;POST&#39; },\r\n..........\r\n    }\r\n  );\r\n});\r\n\r\nmymodule.controller(&quot;UsersNewCtrl&quot;, function($scope, userResource, $location) {\r\n  $scope.user = new userResource();\r\n  $scope.submit = function() {\r\n    function success(response) {\r\n      $location.path(&quot;\/users\/&quot; + response.id);\r\n    }\r\n    function failure(response) {\r\n      console.log(&quot;failure&quot;, response)\r\n    }\r\n    userResource.create($scope.user, success, failure);\r\n  };\r\n});<\/pre>\r\n\r\n<p><strong>2)Rails controller create action<\/strong><\/p>\r\n\r\n<p>$ vi app\/controllers\/users_controller.rb<\/p>\r\n\r\n<pre class=\"prettyprint\">\r\n  def create\r\n    @user = User.new(user_params)\r\n    if @user.save\r\n      render json: @user, status: :created, location: @user\r\n    else\r\n      render json: @user.errors, status: :unprocessable_entity\r\n    end\r\n  end\r\n\r\nprivate\r\n  def user_params\r\n    params.permit(:name:email,:password,:password_confirmation)\r\n  end\r\n<\/pre>\r\n\r\n<p><strong>3)CSRF<\/strong><\/p>\r\n\r\n<p>*Problem<\/p>\r\n\r\n<p>Can&#39;t verify CSRF token authenticity<br \/>\r\nCompleted 422 Unprocessable Entity in 1ms<\/p>\r\n\r\n<p>*Avoidance<\/p>\r\n\r\n<p>$ vi app\/assets\/javascripts\/mymodule.js.erb<\/p>\r\n\r\n<pre class=\"prettyprint\">\r\nmyModule.config(function($httpProvider) {\r\n  $httpProvider.defaults.headers.common[&#39;X-CSRF-Token&#39;] = $(&#39;meta[name=csrf-token]&#39;).attr(&#39;content&#39;);\r\n});<\/pre>\r\n\r\n<p><strong>4)test operation<\/strong><\/p>\r\n\r\n<p>1.home view<br \/>\r\n2.click &quot;Sign up now!&quot;<br \/>\r\n3.user sign up<br \/>\r\n4.user&#39;s profile view<\/p>\r\n","protected":false},"excerpt":{"rendered":"<p>(1)Adding a secure password 1)configuration 1.bcrypt-ruby install $ vi Gemfile gem &#39;bcrypt&#39; $ bundle install 2.add &quot;password_digest&quot; columns to the users table $ rails generate migration add_password_digest_to_users password_digest:string &nbsp; &nbsp; &nbsp; invoke &nbsp;active_record &nbsp; &nbsp; &nbsp; create &nbsp; &nbsp;db\/migrate\/20150713044621_add_password_digest_to_users.rb $ more db\/migrate\/20150713044621_add_password_digest_to_users.rb class AddPasswordDigestToUsers &lt; ActiveRecord::Migration def change add_column :users, :password_digest, :string end end 3.migration [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[137],"tags":[35,151,150,145],"amp_enabled":true,"_links":{"self":[{"href":"http:\/\/www.honobono-life.info\/wpeng\/wp-json\/wp\/v2\/posts\/1083"}],"collection":[{"href":"http:\/\/www.honobono-life.info\/wpeng\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.honobono-life.info\/wpeng\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.honobono-life.info\/wpeng\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.honobono-life.info\/wpeng\/wp-json\/wp\/v2\/comments?post=1083"}],"version-history":[{"count":1,"href":"http:\/\/www.honobono-life.info\/wpeng\/wp-json\/wp\/v2\/posts\/1083\/revisions"}],"predecessor-version":[{"id":1084,"href":"http:\/\/www.honobono-life.info\/wpeng\/wp-json\/wp\/v2\/posts\/1083\/revisions\/1084"}],"wp:attachment":[{"href":"http:\/\/www.honobono-life.info\/wpeng\/wp-json\/wp\/v2\/media?parent=1083"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.honobono-life.info\/wpeng\/wp-json\/wp\/v2\/categories?post=1083"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.honobono-life.info\/wpeng\/wp-json\/wp\/v2\/tags?post=1083"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}