{"id":1092,"date":"2015-08-03T12:28:14","date_gmt":"2015-08-03T12:28:14","guid":{"rendered":"http:\/\/www.honobono-life.info\/wpeng\/?p=1092"},"modified":"2015-08-03T12:28:52","modified_gmt":"2015-08-03T12:28:52","slug":"angularjs-form-validating-form-server-side","status":"publish","type":"post","link":"http:\/\/www.honobono-life.info\/wpeng\/angularjs-form-validating-form-server-side\/","title":{"rendered":"Ruby on Rails Tutorial AngularJS form, validating form server-side"},"content":{"rendered":" <p><strong>(1)Rails validation<\/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  validates :password, length: { minimum: 6 }\r\n  validates :name,  presence: true, length: { maximum: 20 }\r\n  VALID_EMAIL_REGEX = \/\\A[\\w+\\-.]+@[a-z\\d\\-.]+\\.[a-z]+\\z\/i\r\n  validates :email, presence: true, format: { with: VALID_EMAIL_REGEX },\r\n                    uniqueness: { case_sensitive: false }\r\nend<\/pre>\r\n\r\n<p><strong>(2)AngularJS controller<\/strong><\/p>\r\n\r\n<p><strong>1)underscore.js include<\/strong><\/p>\r\n\r\n<p>$ vi app\/assets\/javascripts\/application.js<\/p>\r\n\r\n<p>\/\/= require underscore-min<\/p>\r\n\r\n<p><strong>2)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, $location, flashService) {\r\n.....\r\n  $scope.submit = function() {\r\n.......\r\n    function failure(response) {\r\n      _.each(response.data, function(errors, key) {\r\n        _.each(errors, function(e) {\r\n          $scope.userNewForm[key].$dirty = true;\r\n          $scope.userNewForm[key].$setValidity(e, false);\r\n        });\r\n      });\r\n    }\r\n    userResource.create($scope.user, success, failure);\r\n  };\r\n  $scope.errorMessage = function(name) {\r\n    var s = $scope.userNewForm[name].$error;\r\n    result = [];\r\n    _.each(s, function(key, value) {\r\n      result.push(name + &quot; &quot; + value);\r\n    });\r\n    return result.join(&quot;, &quot;);\r\n  };\r\n});<\/pre>\r\n\r\n<p><strong>(3)AngularJS template view<\/strong><\/p>\r\n\r\n<p>$ vi app\/assets\/templates\/users\/new.html.erb<\/p>\r\n\r\n<div ng-non-bindable><pre class=\"prettyprint\">\r\n&lt;div ng-controller=&quot;UsersNewCtrl&quot; class=&quot;row&quot;&gt;\r\n&lt;style&gt;\r\n  form.ng-invalid.ng-dirty { background-color: lightpink; }\r\n  form.ng-valid.ng-dirty { background-color: lightgreen; }\r\n  form { padding: 10px;}\r\n&lt;\/style&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; ng-class=&quot;{&#39;has-error&#39;: userNewForm.name.$invalid &amp;&amp; userNewForm.name.$dirty}&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;\r\n            required\r\n            ng-maxlength=&quot;20&quot; \/&gt;\r\n          &lt;span class=&quot;text-danger&quot; ng-show=&quot;userNewForm.name.$dirty &amp;&amp; userNewForm.name.$error.required&quot;&gt;\r\n            Name can&#39;t be blank\r\n          &lt;\/span&gt;\r\n          &lt;span class=&quot;text-danger&quot; ng-show=&quot;userNewForm.name.$dirty &amp;&amp; userNewForm.name.$error.maxlength&quot;&gt;\r\n            Name is too long (maximum is 20 characters)\r\n          &lt;\/span&gt;\r\n          &lt;span class=&quot;text-danger&quot; ng-show=&quot;userNewForm.name.$dirty &amp;&amp; userNewForm.name.$invalid&quot;&gt;\r\n            {{errorMessage(&#39;name&#39;)}}\r\n          &lt;\/span&gt;\r\n        &lt;\/div&gt;\r\n        &lt;div class=&quot;form-group&quot; ng-class=&quot;{&#39;has-error&#39;: userNewForm.email.$invalid &amp;&amp; userNewForm.email.$dirty}&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;\r\n            required \/&gt;\r\n          &lt;span class=&quot;text-danger&quot; ng-show=&quot;userNewForm.email.$dirty &amp;&amp; userNewForm.email.$error.required&quot;&gt;\r\n            Email can&#39;t be blank\r\n          &lt;\/span&gt;\r\n          &lt;span class=&quot;text-danger&quot; ng-show=&quot;userNewForm.email.$dirty &amp;&amp; userNewForm.email.$error.email&quot;&gt;\r\n            Email is invalid\r\n          &lt;\/span&gt;\r\n          &lt;span class=&quot;text-danger&quot; ng-show=&quot;userNewForm.email.$dirty &amp;&amp; userNewForm.email.$invalid&quot;&gt;\r\n            {{errorMessage(&#39;email&#39;)}}\r\n          &lt;\/span&gt;\r\n        &lt;\/div&gt;\r\n        &lt;div class=&quot;form-group&quot; ng-class=&quot;{&#39;has-error&#39;: userNewForm.password.$invalid &amp;&amp; userNewForm.password.$dirty}&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;\r\n            required\r\n            ng-minlength=&quot;6&quot; \/&gt;\r\n          &lt;span class=&quot;text-danger&quot; ng-show=&quot;userNewForm.password.$dirty &amp;&amp; userNewForm.password.$error.required&quot;&gt;\r\n            Password can&#39;t be blank\r\n          &lt;\/span&gt;\r\n          &lt;span class=&quot;text-danger&quot; ng-show=&quot;userNewForm.password.$dirty &amp;&amp; userNewForm.password.$error.maxlength&quot;&gt;\r\n            Password is too short (minimum is 6 characters)\r\n          &lt;\/span&gt;\r\n          &lt;span class=&quot;text-danger&quot; ng-show=&quot;userNewForm.password.$dirty &amp;&amp; userNewForm.password.$invalid&quot;&gt;\r\n            {{errorMessage(&#39;password&#39;)}}\r\n          &lt;\/span&gt;\r\n        &lt;\/div&gt;\r\n        &lt;div class=&quot;form-group&quot; ng-class=&quot;{&#39;has-error&#39;: userNewForm.password_confirmation.$invalid &amp;&amp; userNewForm.password_confirmation.$dirty}&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;\r\n              required\r\n              ng-minlength=&quot;6&quot; \/&gt;\r\n          &lt;span class=&quot;text-danger&quot; ng-show=&quot;userNewForm.password_confirmation.$dirty &amp;&amp; userNewForm.password_confirmation.$error.required&quot;&gt;\r\n            Password_confirmation can&#39;t be blank\r\n          &lt;\/span&gt;\r\n          &lt;span class=&quot;text-danger&quot; ng-show=&quot;userNewForm.password_confirmation.$dirty &amp;&amp; userNewForm.password_confirmation.$error.maxlength&quot;&gt;\r\n            Password_confirmation is too short (minimum is 6 characters)\r\n          &lt;\/span&gt;\r\n          &lt;span class=&quot;text-danger&quot; ng-show=&quot;userNewForm.password_confirmation.$dirty &amp;&amp; userNewForm.password_confirmation.$invalid&quot;&gt;\r\n            {{errorMessage(&#39;password_confirmation&#39;)}}\r\n          &lt;\/span&gt;\r\n        &lt;\/div&gt;\r\n        &lt;button ng-click=&quot;submit()&quot; class=&quot;btn btn-primary&quot;\r\n                 ng-disabled=&quot;userNewForm.$invalid&quot; &gt;\r\n          Create my account\r\n        &lt;\/button&gt;\r\n        &lt;button ng-click=&quot;resetError(userNewForm)&quot; class=&quot;btn btn-primary&quot;&gt;\r\n          Reset Error\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;<\/pre><\/div>\r\n","protected":false},"excerpt":{"rendered":"<p>(1)Rails validation $ vi app\/models\/user.rb class User &lt; ActiveRecord::Base validates :password, length: { minimum: 6 } validates :name, presence: true, length: { maximum: 20 } VALID_EMAIL_REGEX = \/\\A[\\w+\\-.]+@[a-z\\d\\-.]+\\.[a-z]+\\z\/i validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false } end (2)AngularJS controller 1)underscore.js include $ vi app\/assets\/javascripts\/application.js \/\/= require underscore-min 2)AngularJS controller [&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,145,155],"amp_enabled":true,"_links":{"self":[{"href":"http:\/\/www.honobono-life.info\/wpeng\/wp-json\/wp\/v2\/posts\/1092"}],"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=1092"}],"version-history":[{"count":1,"href":"http:\/\/www.honobono-life.info\/wpeng\/wp-json\/wp\/v2\/posts\/1092\/revisions"}],"predecessor-version":[{"id":1093,"href":"http:\/\/www.honobono-life.info\/wpeng\/wp-json\/wp\/v2\/posts\/1092\/revisions\/1093"}],"wp:attachment":[{"href":"http:\/\/www.honobono-life.info\/wpeng\/wp-json\/wp\/v2\/media?parent=1092"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.honobono-life.info\/wpeng\/wp-json\/wp\/v2\/categories?post=1092"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.honobono-life.info\/wpeng\/wp-json\/wp\/v2\/tags?post=1092"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}