{"id":1095,"date":"2015-08-03T13:31:24","date_gmt":"2015-08-03T13:31:24","guid":{"rendered":"http:\/\/www.honobono-life.info\/wpeng\/?p=1095"},"modified":"2015-08-03T13:55:57","modified_gmt":"2015-08-03T13:55:57","slug":"user-log-in-validation-error-message-with-angularjs","status":"publish","type":"post","link":"http:\/\/www.honobono-life.info\/wpeng\/user-log-in-validation-error-message-with-angularjs\/","title":{"rendered":"Ruby on Rails Tutorial user log in, validation, error message with AngularJS"},"content":{"rendered":"<p><strong>(1)Rails controller, route<\/strong><\/p>\r\n\r\n<p><strong>1)&quot;Sessions&quot; controller<\/strong><\/p>\r\n\r\n<p><strong>1.generate &quot;Sessions&quot; controller<\/strong><\/p>\r\n\r\n<p>$ rails generate controller Sessions<\/p>\r\n\r\n<p><strong>2.create action<\/strong><\/p>\r\n\r\n<p>$ vi app\/controllers\/sessions_controller.rb<\/p>\r\n\r\n<pre class=\"prettyprint\">\r\n  def create\r\n    user = User.find_by(email: session_params[:email].downcase)\r\n    if user &amp;&amp; user.authenticate(session_params[:password])\r\n    else\r\n      msg = {&quot;password&quot; =&gt; [&quot;Invalid email\/password combination&quot;]}\r\n      render json: msg, status: :unprocessable_entity\r\n    end\r\n  end\r\nprivate\r\n  def session_params\r\n    params.permit(:email,:password)\r\n  end<\/pre>\r\n\r\n<p><strong>2)Rails route<\/strong><\/p>\r\n\r\n<p>$ vi config\/routes.rb<\/p>\r\n\r\n<p>&nbsp; match &#39;\/app\/sessions&#39;, to: &#39;sessions#create&#39;, &nbsp;via: &#39;post&#39;<br \/>\r\n&nbsp; match &#39;\/app\/sessions&#39;, to: &#39;sessions#destroy&#39;, via: &#39;delete&#39;<\/p>\r\n\r\n<p><strong>(2)AngularJS &quot;sessionResource&quot; service<\/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;sessionResource&quot;, function($resource) {\r\n  return $resource(&quot;\/app\/sessions&quot;,{},\r\n    {\r\n      &#39;create&#39;:  { method: &#39;POST&#39; },\r\n      &#39;destroy&#39;: { method: &#39;DELETE&#39; }\r\n    }\r\n  );\r\n});<\/pre>\r\n\r\n<p><strong>(3)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\n.when(&quot;\/signin&quot;, {\r\n templateUrl: &quot;&lt;%= asset_path(&#39;sessions\/new.html.erb&#39;) %&gt;&quot;\r\n })<\/pre>\r\n\r\n<p><strong>(4)AngularJS controller<\/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;SessionsNewCtrl&quot;, function($scope, sessionResource) {\r\n  $scope.session = new sessionResource();\r\n  $scope.submit = function() {\r\n    function success(response) {\r\n      console.log(&quot;test&quot;);\r\n    }\r\n    function failure(response) {\r\n      _.each(response.data, function(errors, key) {\r\n        _.each(errors, function(e) {\r\n          $scope.sessionNewForm[key].$dirty = true;\r\n          $scope.sessionNewForm[key].$setValidity(e, false);\r\n        });\r\n      });\r\n    }\r\n    sessionResource.create($scope.session, success, failure);\r\n  };\r\n  $scope.errorMessage = function(name) {\r\n    var s = $scope.sessionNewForm[name].$error;\r\n    result = [];\r\n    _.each(s, function(key, value) {\r\n      result.push(value);\r\n    });\r\n    return result.join(&quot;, &quot;);\r\n  };\r\n  $scope.errorClass = function(name) {\r\n    var s = $scope.sessionNewForm[name];\r\n    return s.$invalid &amp;&amp; s.$dirty ? &quot;has-error&quot; : &quot;&quot;;\r\n  };\r\n});<\/pre>\r\n\r\n<p><strong>(5)AngularJS template view<\/strong><\/p>\r\n\r\n<p>$ vi app\/assets\/templates\/sessions\/new.html.erb<\/p>\r\n\r\n<div ng-non-bindable><pre class=\"prettyprint\">\r\n&lt;div ng-controller=&quot;SessionsNewCtrl&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 in&lt;\/h1&gt;\r\n    &lt;div class=&quot;well&quot;&gt;\r\n      &lt;form name=&quot;sessionNewForm&quot; ng-submit=&quot;submit()&quot; novalidate&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;session.email&quot;\r\n            required \/&gt;\r\n        &lt;\/div&gt;\r\n        &lt;div class=&quot;form-group&quot; ng-class=&quot;errorClass(&#39;password&#39;)&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;session.password&quot; required \/&gt;\r\n          &lt;span class=&quot;help-block&quot; ng-show=&quot;sessionNewForm.password.$invalid &amp;&amp; sessionNewForm.password.$dirty&quot;&gt;\r\n            {{errorMessage(&#39;password&#39;)}}\r\n          &lt;\/span&gt;\r\n        &lt;\/div&gt;\r\n        &lt;button type=&quot;submit&quot; class=&quot;btn btn-large btn-primary&quot;&gt;Sign in&lt;\/button&gt;\r\n      &lt;\/form&gt;\r\n      &lt;p&gt;New user?&lt;a href=&quot;\/users\/new&quot;&gt;Sign up now!&lt;\/a&gt;&lt;\/p&gt;\r\n    &lt;\/div&gt;\r\n  &lt;\/div&gt;\r\n&lt;\/div&gt;\r\n<\/pre><\/div>\r\n\r\n<p><strong>(6)add a link to signin<\/strong><\/p>\r\n\r\n<p>$ vi app\/views\/layouts\/_header.html.erb<\/p>\r\n\r\n<p>&lt;li&gt;&lt;%= link_to &quot;Sing in&quot;, &quot;\/signin&quot; %&gt;&lt;\/li&gt;<\/p>","protected":false},"excerpt":{"rendered":"<p>(1)Rails controller, route 1)&quot;Sessions&quot; controller 1.generate &quot;Sessions&quot; controller $ rails generate controller Sessions 2.create action $ vi app\/controllers\/sessions_controller.rb def create user = User.find_by(email: session_params[:email].downcase) if user &amp;&amp; user.authenticate(session_params[:password]) else msg = {&quot;password&quot; =&gt; [&quot;Invalid email\/password combination&quot;]} render json: msg, status: :unprocessable_entity end end private def session_params params.permit(:email,:password) end 2)Rails route $ vi config\/routes.rb &nbsp; match [&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,145,157,155],"amp_enabled":true,"_links":{"self":[{"href":"http:\/\/www.honobono-life.info\/wpeng\/wp-json\/wp\/v2\/posts\/1095"}],"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=1095"}],"version-history":[{"count":1,"href":"http:\/\/www.honobono-life.info\/wpeng\/wp-json\/wp\/v2\/posts\/1095\/revisions"}],"predecessor-version":[{"id":1096,"href":"http:\/\/www.honobono-life.info\/wpeng\/wp-json\/wp\/v2\/posts\/1095\/revisions\/1096"}],"wp:attachment":[{"href":"http:\/\/www.honobono-life.info\/wpeng\/wp-json\/wp\/v2\/media?parent=1095"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.honobono-life.info\/wpeng\/wp-json\/wp\/v2\/categories?post=1095"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.honobono-life.info\/wpeng\/wp-json\/wp\/v2\/tags?post=1095"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}