{"id":1172,"date":"2015-08-05T13:52:20","date_gmt":"2015-08-05T13:52:20","guid":{"rendered":"http:\/\/www.honobono-life.info\/wpeng\/?p=1172"},"modified":"2015-08-05T13:52:20","modified_gmt":"2015-08-05T13:52:20","slug":"followunfollow-functionality-with-angularjs","status":"publish","type":"post","link":"http:\/\/www.honobono-life.info\/wpeng\/followunfollow-functionality-with-angularjs\/","title":{"rendered":"Ruby on Rails Tutorial follow\/unfollow functionality with AngularJS"},"content":{"rendered":"<p><strong>1)Rails route<\/strong><\/p>\r\n\r\n<p>$ vi config\/routes.rb<\/p>\r\n\r\n<pre class=\"prettyprint\">\r\n  match &#39;\/app\/relationships&#39;, to: &#39;relationships#create&#39;,  via: &#39;post&#39;\r\n  match &#39;\/app\/relationships&#39;, to: &#39;relationships#destroy&#39;, via: &#39;delete&#39;<\/pre>\r\n\r\n<p><strong>2)Rails controller<\/strong><\/p>\r\n\r\n<p>$ vi app\/controllers\/relationships_controller.rb<\/p>\r\n\r\n<pre class=\"prettyprint\">\r\nclass RelationshipsController &lt; ApplicationController\r\n  before_action :signed_in_user\r\n\r\n  def create\r\n    remember_token = User.encrypt(cookies[:remember_token])\r\n    current_user ||= User.find_by(remember_token: remember_token)\r\n    @user = User.find(user_params[:id])\r\n    current_user.follow!(@user)\r\n    head :no_content\r\n  end\r\n\r\n  def destroy\r\n    remember_token = User.encrypt(cookies[:remember_token])\r\n    current_user ||= User.find_by(remember_token: remember_token)\r\n    @user = User.find(user_params[:id])\r\n    current_user.unfollow!(@user)\r\n    head :no_content\r\n  end\r\n\r\n  private\r\n    def user_params\r\n      params.permit(:id)\r\n    end\r\n    def signed_in_user\r\n      remember_token = User.encrypt(cookies[:remember_token])\r\n      current_user ||= User.find_by(remember_token: remember_token)\r\n      if current_user.nil?\r\n        render status: :unauthorized\r\n      end\r\n    end\r\nend<\/pre>\r\n\r\n<p><strong>3)AngularJS &quot;relationshipsResource&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;relationshipsResource&quot;, function($resource) {\r\n  return $resource(&quot;\/app\/relationships&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>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;UsersShowCtrl&quot;, function($scope, $routeParams, userResource, flashService, $filter, micropostsResource, $q, sessionResource, relationshipsResource) {\r\n.....\r\n  $scope.follow = function(id) {\r\n    function success(response) {\r\n      $scope.flg_unfollow = true;\r\n      sessionResource.current_user({}, function(response) {\r\n        flashService.setUser(response);\r\n      });\r\n      $scope.$emit(&quot;$routeChangeSuccess&quot;);\r\n    }\r\n    function failure(response) {\r\n      console.log(&quot;follow error&quot;);\r\n    }\r\n    var user_data = {\r\n      id: id\r\n    };\r\n    relationshipsResource.create(user_data, success, failure);\r\n  };\r\n\r\n  $scope.unfollow = function(id) {\r\n    relationshipsResource.destroy({ id: id }, function(response) {\r\n      $scope.flg_unfollow = false;\r\n      sessionResource.current_user({}, function(response) {\r\n        flashService.setUser(response);\r\n      });\r\n      $scope.$emit(&quot;$routeChangeSuccess&quot;);\r\n    });\r\n  };<\/pre>","protected":false},"excerpt":{"rendered":"<p>1)Rails route $ vi config\/routes.rb match &#39;\/app\/relationships&#39;, to: &#39;relationships#create&#39;, via: &#39;post&#39; match &#39;\/app\/relationships&#39;, to: &#39;relationships#destroy&#39;, via: &#39;delete&#39; 2)Rails controller $ vi app\/controllers\/relationships_controller.rb class RelationshipsController &lt; ApplicationController before_action :signed_in_user def create remember_token = User.encrypt(cookies[:remember_token]) current_user ||= User.find_by(remember_token: remember_token) @user = User.find(user_params[:id]) current_user.follow!(@user) head :no_content end def destroy remember_token = User.encrypt(cookies[:remember_token]) current_user ||= User.find_by(remember_token: remember_token) @user = [&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,187,188],"amp_enabled":true,"_links":{"self":[{"href":"http:\/\/www.honobono-life.info\/wpeng\/wp-json\/wp\/v2\/posts\/1172"}],"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=1172"}],"version-history":[{"count":1,"href":"http:\/\/www.honobono-life.info\/wpeng\/wp-json\/wp\/v2\/posts\/1172\/revisions"}],"predecessor-version":[{"id":1173,"href":"http:\/\/www.honobono-life.info\/wpeng\/wp-json\/wp\/v2\/posts\/1172\/revisions\/1173"}],"wp:attachment":[{"href":"http:\/\/www.honobono-life.info\/wpeng\/wp-json\/wp\/v2\/media?parent=1172"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.honobono-life.info\/wpeng\/wp-json\/wp\/v2\/categories?post=1172"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.honobono-life.info\/wpeng\/wp-json\/wp\/v2\/tags?post=1172"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}