30
29

More than 5 years have passed since last update.

<Rails4> と <Angular.js>で検索機能作る

Last updated at Posted at 2013-12-22

参考になるサイト

RubyとRailsのバージョン

ruby '2.0.0'
rails', '4.0.1'

RailsとAngular.jsを使って検索機能作る。

ポイントは検索結果がリロードなしですぐに反映される事。

gemfileに下記を追加

Gemfile
gem 'angularjs-rails'
gem 'angularjs-rails-resource', '~> 0.2.3'

angularjs-rails-resourceはAngularJSのモジュールの中にあるngResourceを使うために導入。

フォルダとファイルを作る。

% > mkdir -p app/assets/javascripts/angular/controllers \
           app/assets/javascripts/angular/services

% > touch app/assets/javascripts/angular/controllers/article_ctrl.js \
                  app/assets/javascripts/angular/services/article.js \
                  app/assets/javascript/app.js

application.jsに下記を記入

application.js

//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require angular
//= require angular-resource
//= require app
//= require_tree

app.jsに下記を記入

app.js
window.App = angular.module('Ahiru', ['ngResource']);

application.html.erbのhtml要素に下記のものを追加

<html>  ー> <html ng-app ="Ahiru">

article_ctrl.jsに下記を記入

article_ctrl.js
var app = angular.module('Ahiru');


app.controller('ArticlesCtrl', [
  '$scope', 'Article', function($scope, Article) {
    return $scope.articles = Article.query();
  }
]);

article.jsに下記を記入

article.js
var app = angular.module('Ahiru');
app.factory('Article', function($resource) {
  return $resource('/api/articles/:id', {id: '@id'});
});

コントローラーはTopCotrollerとArticleControllerの二つ
モデルはArticleのみ

route.rbに下記を記入

route.rb
Ahiru::Application.routes.draw do
  root to: 'top#index'
  scope :api do
    get "/articles(.:format)" => "articles#index"
    get "/articles/:id(.:format)" => "articles#show"
  end

end

モデルを作る

% > rails g model article title:string content:text 

% > rake db:migrate
top_controller.rb
class TopController < ApplicationController

  def index
  end

end
articles_controller.rb
class ArticlesController < ApplicationController

  def index
    render json: Article.order("created_at DESC")
  end

  def show
    render json: Article.find(params[:id])
  end

end

app/views/top/index.html.erbを作成し下記を記入

index.html.erb

<h2>記事検索</h2>
Search: <input ng-model="query">

  <div ng-controller="ArticlesCtrl">
    </ul>
    <ul>
      <li ng-repeat=" article in articles  | filter:query ">
        <h3>{{ article.title }}</h3>
        <p>({{ article.content }})</p>
      </li>
    </ul>
  </div>

seedファイルに下記のデータを投入

seeds.rb
title_name = %w(perl ruby python php java) * 6

0.upto(30) do |idx|
Article.create(
  title: title_name[idx],
  content: "避暑地・鎌倉を訪れた大学生の「私」は、由比が浜で見かけた「先生」に興味を持ちます。\n
           言葉を交わすようになりましたが、「先生」の態度はそっけないものでした。回想の物語で \n
           ある本作を語る「語り手の私」は、「先生の亡くなった今日になって、はじめて」、先生は \n
           自分を嫌っていたわけではなかったとわかりはじめたと振り返ります。"
  )
end
% > rake db:seed

完成画像

スクリーンショット 2013-12-22 13.47.19.png

終了

30
29
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
29