{"id":1103,"date":"2015-08-04T03:39:23","date_gmt":"2015-08-04T03:39:23","guid":{"rendered":"http:\/\/www.honobono-life.info\/wpeng\/?p=1103"},"modified":"2015-08-04T03:39:23","modified_gmt":"2015-08-04T03:39:23","slug":"changing-the-navigation-links-based-on-login-status-with-angularjs","status":"publish","type":"post","link":"http:\/\/www.honobono-life.info\/wpeng\/changing-the-navigation-links-based-on-login-status-with-angularjs\/","title":{"rendered":"Ruby on Rails Tutorial changing the navigation links based on login status with AngularJS"},"content":{"rendered":"<p><strong>(1)AngularJS 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;flashService&quot;, function ($rootScope) {\r\n  var currentUser = { user: {id: 0} };\r\n  return {\r\n    getUser: function () {\r\n      return currentUser;\r\n    },\r\n    setUser: function (user) {\r\n      currentUser = user;\r\n    }\r\n  };\r\n});<\/pre>\r\n\r\n<p><strong>(2)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, $location, flashService) {\r\n  $scope.submit = function() {\r\n    function success(response) {\r\n      var user_info = response;\r\n      flashService.setUser(user_info);\r\n      $location.path(&quot;\/users\/&quot; + response.user.id);\r\n    }\r\n    function failure(response) {\r\n........\r\n    }\r\n    sessionResource.create($scope.session, success, failure);\r\n  };<\/pre>\r\n\r\n<p>ref.<br \/>\r\nRails &quot;sessions&quot; controller<\/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      remember_token = User.new_remember_token\r\n      cookies.permanent[:remember_token] = remember_token\r\n      user.update_attribute(:remember_token, User.encrypt(remember_token))\r\n      @user_info = {\r\n        user: user\r\n      }\r\n      render json: @user_info, status: :accepted, location: user\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<\/pre>\r\n\r\n<p><strong>(3)navigation menu<\/strong><\/p>\r\n\r\n<p><strong>1)AngularJS template view&nbsp;<\/strong><\/p>\r\n\r\n<p>$ vi app\/views\/layouts\/_header.html.erb<\/p>\r\n\r\n<div ng-non-bindable><pre class=\"prettyprint\">\r\n&lt;div ng-controller=&quot;CollapseDemoCtrl&quot; class=&quot;navbar navbar-default navbar-fixed-top&quot; role=&quot;navigation&quot;&gt;\r\n.........\r\n  &lt;div class=&quot;navbar-collapse&quot; collapse=&quot;isCollapsed&quot;&gt;\r\n    &lt;ul class=&quot;nav navbar-nav&quot;&gt;\r\n.........\r\n      &lt;li ng-hide=&quot;chkSignin().user.id &gt; 0&quot;&gt;&lt;%= link_to &quot;Sign in&quot;, &quot;\/signin&quot; %&gt;&lt;\/li&gt;\r\n      &lt;li ng-show=&quot;chkSignin().user.id &gt; 0&quot;&gt;&lt;%= link_to &quot;Users&quot;, &quot;\/users&quot; %&gt;&lt;\/li&gt;\r\n      &lt;li ng-show=&quot;chkSignin().user.id &gt; 0&quot; class=&quot;dropdown&quot; dropdown&gt;\r\n        &lt;a class=&quot;dropdown-toggle&quot; dropdown-toggle&gt;Account&lt;span class=&quot;caret&quot;&gt;&lt;\/span&gt;&lt;\/a&gt;\r\n        &lt;ul class=&quot;dropdown-menu&quot;&gt;\r\n          &lt;li&gt;&lt;%= link_to &quot;Profile&quot;, &quot;\/users\/{{chkSignin().user.id}}\/&quot; %&gt;&lt;\/li&gt;\r\n          &lt;li&gt;&lt;%= link_to &quot;Settings&quot;, &quot;\/users\/{{chkSignin().user.id}}\/edit&quot; %&gt;&lt;\/li&gt;\r\n          &lt;li role=&quot;separator&quot; class=&quot;divider&quot;&gt;&lt;\/li&gt;\r\n          &lt;li&gt;&lt;%= link_to &quot;Sign out&quot;, &quot;\/signout&quot; %&gt;&lt;\/li&gt;\r\n        &lt;\/ul&gt;\r\n      &lt;\/li&gt;<\/pre><\/div>\r\n\r\n<p><strong>2)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\nfunction CollapseDemoCtrl($scope, flashService) {\r\n  $scope.chkSignin = function() {\r\n    return flashService.getUser();\r\n  };\r\n}<\/pre>\r\n\r\n<p><strong>(4)countermeasure of the browser reload<\/strong><\/p>\r\n\r\n<p><strong>1)AngularJS run method<\/strong><\/p>\r\n\r\n<pre class=\"prettyprint\">\r\nmyModule.run(function (sessionResource,flashService) {\r\n  sessionResource.current_user({}, function(response) {\r\n    if (response.user &amp;&amp; response.user.id) {\r\n      var user_info = response;\r\n    } else {\r\n      var user_info = { user: {id: 0} };\r\n    }\r\n    flashService.setUser(user_info);\r\n  });\r\n});\r\n\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      &#39;current_user&#39;: { method: &#39;GET&#39;, isArray: false }\r\n    }\r\n  );\r\n});\r\n\r\nmyModule.factory(&quot;flashService&quot;, function ($rootScope) {\r\n  var currentUser = { user: {id: 0} };\r\n  return {\r\n    getUser: function () {\r\n      return currentUser;\r\n    },\r\n    setUser: function (user) {\r\n      currentUser = user;\r\n    }\r\n  };\r\n});<\/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#current_user&#39;, via: &#39;get&#39;<\/p>\r\n\r\n<p><strong>3)Rails &quot;sessions&quot; controller<\/strong><\/p>\r\n\r\n<p>$ vi app\/controllers\/sessions_controller.rb<\/p>\r\n\r\n<pre class=\"prettyprint\">\r\n  def current_user\r\n    remember_token = User.encrypt(cookies[:remember_token])\r\n    current_user ||= User.find_by(remember_token: remember_token)\r\n    @user_info = {\r\n      user: current_user\r\n    }\r\n    render json: @user_info, status: :accepted\r\n  end<\/pre>","protected":false},"excerpt":{"rendered":"<p>(1)AngularJS service $ vi app\/assets\/javascripts\/mymodule.js.erb myModule.factory(&quot;flashService&quot;, function ($rootScope) { var currentUser = { user: {id: 0} }; return { getUser: function () { return currentUser; }, setUser: function (user) { currentUser = user; } }; }); (2)AngularJS controller $ vi app\/assets\/javascripts\/mymodule.js.erb myModule.controller(&quot;SessionsNewCtrl&quot;, function($scope, sessionResource, $location, flashService) { $scope.submit = function() { function success(response) { var [&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":[161,159,160],"amp_enabled":true,"_links":{"self":[{"href":"http:\/\/www.honobono-life.info\/wpeng\/wp-json\/wp\/v2\/posts\/1103"}],"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=1103"}],"version-history":[{"count":1,"href":"http:\/\/www.honobono-life.info\/wpeng\/wp-json\/wp\/v2\/posts\/1103\/revisions"}],"predecessor-version":[{"id":1104,"href":"http:\/\/www.honobono-life.info\/wpeng\/wp-json\/wp\/v2\/posts\/1103\/revisions\/1104"}],"wp:attachment":[{"href":"http:\/\/www.honobono-life.info\/wpeng\/wp-json\/wp\/v2\/media?parent=1103"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.honobono-life.info\/wpeng\/wp-json\/wp\/v2\/categories?post=1103"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.honobono-life.info\/wpeng\/wp-json\/wp\/v2\/tags?post=1103"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}