1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Rails】Ruby on Railsについて

Posted at

記事概要

フレームワークRuby on Railsについて、まとめる

基本理念

基本理念を遵守することで、フレームワークの能力を最大限に活かすことができる

DRY(Don't Repeat Yourself)

「同じ情報を繰り返し定義しない」という考え方
情報:メソッドや配列など、データの集合体など
→同じコードを繰り返し記述しないという捉え方で問題ない

  • メリット
    • 可読性が向上する
    • コード量を減らすことによって、アプリケーションの動作が早くなる
# Not DRY
orange_price = 100 * 1.1
peach_price = 200 * 1.1
apple_price = 300 * 1.1

# DRY
tax = 1.1
orange_price = 100 * tax
peach_price = 200 * tax
apple_price = 300 * tax

CoC(Convention Over Configuration)

「設定よりも規約を優先する」という考え方

  • メリット
    • 開発スピードが上がる
    • 質を担保できる
    • 規約は開発者同士の共通認識であるため、可読性が向上する
# Not CoC
class TestsController < ApplicationController
 def render_top_page
  render template: "tests/index"
 end
end

# CoC
class TestsController < ApplicationController
 def index
 end
end

ディレクトリ

Ruby on Railsのアプリケーションのディレクトリ階層は、規約に則って整理されている

  • アプリ名
    • app
      ※ MVCに関するファイルなどを格納している、アプリケーションの主要ディレクトリ
    • bin
      ※ Binary Codeの略。コマンドなどで実行するファイルが格納されている
    • config
      ※ アプリケーションの設定関係のファイルが格納されている
    • db
      ※ データベースに関するファイルが格納されている
    • lib
      ※ libraryの略で、基本的なライブラリが格納されている
    • log
      ※ アプリケーションが動いている間の記録などのファイルが格納されている
    • node_modules
      ※ nodeのパッケージが格納されている
    • public
      ※ デフォルトで表示される画面の情報などが格納されている
    • storage
      ※ 画像などをアプリケーション自体に保存する際に使用するディレクトリ
    • test
      ※ アプリケーションのテストを行う際に使用するファイルを格納するディレクトリ
    • tmp
      ※ アプリケーションが起動している際の一時的な情報を格納するディレクトリ
    • vendor
      ※ ライブラリ(Gem)などをアプリケーション自体にインストールする際に使用するディレクトリ
    • .browserslistrc
    • .ruby-version
    • babel.config.js
    • config.ru
    • Gemfile
    • Gemfile.lock
    • package.json
    • postcss.config.js
    • Rakefile
    • README.md
    • yarn.lock

オブジェクト指向

オブジェクト指向言語であるRubyで作られているため、Ruby on Railsもオブジェクト指向の考えに則って作られている

Viewの構造を意識

Action View

Ruby on Railsのアプリケーションにおいて、ビューの機能を実現するために必要な処理のオブジェクトのこと

ヘルパーメソッド

ビューでHTMLタグを出現させたりテキストを加工するために使用するメソッドの総称
あらかじめ用意されているヘルパーメソッドは、こちらを参照

すでに用意されているヘルパーメソッド以外に、ヘルパーメソッドを自作することもできる

モジュール

Rubyにおける「インスタンスを生成できないクラス」のようなもののこと

module モジュール名

end
module Sample1
 class Test
 end
end

module Sample2
 class Test
 end
end

# Testクラスの呼び出し
Sample1::Test
Sample2::Test

Helper

ヘルパーメソッドを作成できるモジュール

app/helpers配下に用意されており、application_helper.rbや各コントローラーに対応したhelperのファイルに処理を記述することでヘルパーメソッドとして使用できる

作成方法は、こちらを参照

application_helper.rb
module ApplicationHelper
  def sample
    # sampleというヘルパーメソッド
  end
end
<!-- application_helper.rbで定義したsampleのヘルパーメソッドを、ビューファイルで使用できる -->
<%= sample %>

コントローラーの構造を意識

Action Controller

Ruby on Railsのアプリケーションにおいて、コントローラーの機能を実現するために必要なオブジェクトのこと

レンダリング

指定したHTMLなどのビューファイルを画面に描画すること
フォーマットは、JSONを使用する場合が多い

サービスクラス

コントローラー内のコードの可読性を高めるために用いる概念

Image from Gyazo

作成方法は、こちらを参照

モデルの構造を意識

Active Model

Ruby on Railsのアプリケーションにおいて、モデルの機能を実現するために必要なオブジェクトのこと

Callbacksモジュール

データ保存時などの任意のタイミングで実行する処理を設定できるモジュール

class Tweet < ApplicationRecord
 validates :text, presence: true

 # バリデーションの後で「puts_done」を実行
 after_validation :puts_done

 private
 # 「puts_done」という、任意のタイミングで実行する処理を登録
   def puts_done
     puts 'validation completed'
   end
end

Validationsモジュール

データの保存時に検証するような役割がある

Image from Gyazo

Serializationモジュール

JSONなどで返却される値を整えることができるモジュール

Image from Gyazo

  • Serializationモジュールを使用しないケース
    tweet.rb
    class Tweet < ApplicationRecord
      validates :text, presence: true
    end
    
    tweets_controller.rb
    class TweetsController < ApplicationController
      def index
        @tweets = Tweet.includes(:user).order("created_at DESC")
        render json: @tweets
      end
    end
    
    # JSONで返却されている内容は「id, text, image, created_at, updated_at, user_id」
    # [
    #   {"id":2,"text":"太陽の写真","image":"data:image/sample","created_at":"2020-04-22T06:11:44.134Z","updated_at":"2020-04-22T06:11:44.134Z","user_id":1},
    #   {"id":1,"text":"綺麗な景色","image":"data:image/jpeg;base64,/9j","created_at":"2020-04-22T06:11:25.425Z","updated_at":"2020-04-22T06:11:25.425Z","user_id":1},
    # ]
    
  • Serializationモジュールを使用するケース
    tweet.rb
    class Tweet < ApplicationRecord
      # JSONで返却する値を指定するために追加
      def attributes
        {'text' => nil, 'image' => nil}
      end
      validates :text, presence: true
    end
    
    tweets_controller.rb
    class TweetsController < ApplicationController
      def index
        @tweets = Tweet.includes(:user).order("created_at DESC")
        render json: @tweets
      end
    end
    
    # JSONで返却されている内容は「text, image」
    # [
    #   {"text":"太陽の写真","image":"data:image/sample"},
    #   {"text":"綺麗な景色","image":"data:image/jpeg;base64,/9j"}
    # ]
    

Formオブジェクト

フォームに関する処理を切り出す仕組みのことであり、大きく分けて下記2つの場合に使用する

  • フォームから入力された値が複数のモデルに関連するデータであり、一度に複数モデルを操作して、それぞれのデータを更新したい場合
    Image from Gyazo
    実装方法の説明
    1. モデルを生成する
      item.rb
      class Item < ApplicationRecord
      end
      
      genre.rb
      class Genre < ApplicationRecord
      end
      
    2. app/modelsディレクトリ配下に、item_form.rbを手動生成する
    3. itemモデルとgenreモデルの情報を検証・保存する処理を記述する
      item_form.rb
      class ItemForm
       include ActiveModel::Model
      
       attr_accessor :text, :genre
       validates :text, presence: true
       validates :genre, presence: true
      
       def save
         Item.create(text: text)
         Genre.create(genre: genre)
       end
      end
      
    4. コントローラーで、ItemFormというクラス名を呼び出す
      items_controller.rb
      class ItemsController < ApplicationController
       def index
       end
      
       def create
         @item = ItemForm.new(set_params)
         if @item.valid?
           @item.save
         end
       end
      
       private
       def set_params
         params.permit(:text, :genre)
       end
      end
      
  • フォームから入力された値に対応するモデルは無いものの、バリデーションをかけたい場合
    Image from Gyazo

モデルによるデータベースの操作

ActiveRecord

モデルによるデータベースの操作を実現する仕組み

Ruby on Railsまとめ

1
0
0

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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?