LoginSignup
15
10

More than 3 years have passed since last update.

Ruby on railsとDjangoの違いまとめ~基礎編~

Last updated at Posted at 2020-01-04

1. はじめに

 プログラミングを始めて4ヶ月の初心者です!
Ruby on railsとDjangoを勉強中なので、
アウトプット(備忘録)として、その基礎的なコードの違いを書いていきたいと思います!!:pencil2::beginner:
railsから学習を始めていることから、
基本rails目線で、Djangoの場合はどうか?という目線で書いております:smile:
少しでも、ご参考になりましたら幸いです。
(勉強中なので、随時追記・修正していく予定です!)

2. MVCモデル(Rails)MTVモデル(Django)

"View"の名前が被っているので、ややこしい感じがしますが、大まかな流れは同じです。
自分のイメージを以下に示します。
スクリーンショット 2020-01-04 20.46.48.png

3. ルーティング編

(Railsの場合)
routes.rbに記載していきます。
ターミナル上で"rake routes"を叩けば、URLパターンやprefixを確認できます!

config/routes.rb
root 'products#index'
get 'index', to: 'products#index'

(Djangoの場合)
urls.pyに記載していきます。
path()関数を使用し、これは引数にroute,view,name,kwargsの4つの引数を取ります。
ここでは、ルートURL('')に、viewのindex関数を対応させ、indexという名称で他のファイル(templateなど)から呼び出せるようにしています。
viewにおいて汎用クラスを呼び出す場合は、"as_view"を使用します。

app/urls.py
from django.urls import path
from . import views

app_name = "アプリ名"

urlpatterns = [
    path("", views.index, name="index"),
    path("products/", views.ProductListView.as_view(), name="products_list"),
]

4. コントローラー/ビュー編

4-1. htmlファイルの指定方法

(Railsの場合)
controllerのアクション名と同じ名前のviewが呼び出されるというルールがありますので、
特にコードは必要なく、アクション名と同名のviewファイルを準備することで、そのview(html)ファイルが呼び出されます。

controllers/products_controller.rb
def index
end
views/index.html.erb
.title
  haml等でhtmlを記載していきます

(Djangoの場合)
関数を使用するか、クラスを使用するかによって、
それぞれ、renderメソッドかtemplate_nameメソッドを使用します(他にもいっぱいあるようです)

app/views.py
# 関数を使用する場合
def index(request):
    return render(request, "index.html")

# クラスを使用する場合
class ModelListView(ListView):
  model = Model
  template_name = "index.html" 

4-2.インスタンス変数のhtmlファイルへの渡し方

(Railsの場合)
htmlファイルにおいて、変数を使用するために、@をつけて、インスタンス変数を定義します。

products_controller.rb

def index
  @product = Product.where(id: 1..10)
end

(Djangoの場合)
変数がないのにhtmlファイルでデータが扱える、というのが衝撃的です!

views.rb
class XxxListView(LoginRequiredMixin, ListView):
  model = Xxx
  template_name = "xxx.html"
  # templateにおいて、xxx_listで配列としてデータが使用できる

  def get_context_data(self, **kwargs):
    context["hennsu"] = "value"
    return context
    #本メソッドで"hennsuという変数を渡すことができます

(とはいっても、get_context_dataやget_querysetで変数の定義やデータの選択が可能です)

5. ビュー/テンプレート編

・部分テンプレートの書き方

(Railsの場合)
renderメソッドを使用します。

index.html.erb
<%= render '(フォルダ名/)yyy.html.erb' %>
-# render先は'_yyy.html.erb'という名称とします

(Djangoの場合)

base.html
{% block content %}
  # ここに他のhtmlファイルを差し込みます
{% endblock %}
index.html
{% extends "base.html" %}
{% block content %}
  # この部分をbase.htmlに差し込みます(逆かもしれません)
{% endblock %}

ここはrailsの方が自由度が高いかと思います。

・ログインしているユーザー情報の表示

(Railsの場合)

view.html.haml
 - if user_signed_in?
   %div
     current_user.name

(Djangoの場合)

template.html
{% if user.is_authenticated %}
  <div> User Name: {{ user.username }} </div>

6. モデル編

・マイグレーション

(Railsの場合)
モデルの作成 (rails g model Xxx) or マイグレーションファイルの作成 (rails g migration)
->マイグレーションファイルの記入
->マイグレーションの実行(rake db:migrate)

Migrationファイル
##一例です
  t.string :name,               null: false

(Djangoの場合)
models.pyへの記入
->マイグレーションファイルの作成(python manage.py makemigrations)
->マイグレーションの実行(python manage.py migrate)

models.py
class Xxx(models.Model):
  xxx = models.CharField(max_length=200)
  user = models.ForeignKey(User, on_delete=models.CASCADE)

  def __str__(self):
    return self.title

7. 感想

触っている時間が長いせいもあるかと思いますが、
railsの方がファイルの関係性も簡潔であり、
erbファイルにロジックが書けたりと、コードの自由度が高く、狙い通りのアプリを作成しやすい気がします。
一方で、Djangoは、やや構成に癖があるような気がします。
ただ、記述量が少なく、慣れたら速そうです。
さらに、pythonのメリットは豊富なライブラリにあると考えているので、
その豊富なライブラリをアプリで活かせるかどうか、が、ポイントのような気がしています。
(もっと勉強して、随時修正予定です!)
読んでいただきありがとうございました:bow_tone3:

15
10
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
15
10