+2

Cấu trúc folder một dự án Rails

Chào mọi người! Hôm nay mình trở lại và hứa hẹn còn lợi hại hơn xưa.

Chủ đề hôm nay mình muốn mang đến cho các bạn một cách dễ dàng nhất và hiểu được cấu trúc thường có của bất kì một project rails đều áp dụng và một số mô hình được áp dụng để cải tiến thêm cho dự án. Yên tâm là đọc hết bài này nếu bạn chưa biết code ruby on rails thế nào thì bạn cũng sẽ .................................................... không biết đâu, nhưng cái bạn biết là rails sẽ làm tạo ra những gì khi nhấn rails new {project_name}, hay vớ được đống code nào đó thấy hay chỗ nào thì có thể dễ dàng tìm kiếm đoạn đó mà không nghĩ cái đó là magic. Thực sự bản thân mình cảm thấy ngôn ngữ ruby và framework rails rất dễ tiếp cận và có thể code nó, thư viện ruby hỗ trợ khá nhiều về xử lý tính toán, mọi thứ rất giống với các lệnh thật ngoài đời như muốn lấy time hiện tại thì Time.now. Vậy về mặt tổ chức cấu trúc folder source rails có gì? Để biết được điều đó bỏ qua các bước cài đặt môi trường ruby cũng như rails. Khi bạn bắt đầu làm một project mới lệnh đầu tiên sẽ là

rails new {project_name}

Sau đó vào folder {project_name} bạn sẽ thấy hàng loạt folder cũng như file được tạo ra, mọi thứ cứ như magic. Ở đây là cây thư mục default của rails project

|-- app
|   |-- assets
|   |   |-- images
|   |   |-- javascripts
|   |   |   `-- application.js
|   |   `-- stylesheets
|   |       `-- application.css
|   |-- controllers
|   |   |-- application_controller.rb
|   |   `-- concerns
|   |-- helpers
|   |   `-- application_helper.rb
|   |-- mailers
|   |-- models
|   |   `-- concerns
|   `-- views
|       `-- layouts
|           `-- application.html.erb
|-- bin
|   |-- bundle
|   |-- rails
|   |-- rake
|   |-- setup
|   `-- spring
|-- config
|   |-- application.rb
|   |-- boot.rb
|   |-- database.yml
|   |-- environment.rb
|   |-- environments
|   |   |-- development.rb
|   |   |-- production.rb
|   |   `-- test.rb
|   |-- initializers
|   |   |-- assets.rb
|   |   |-- backtrace_silencers.rb
|   |   |-- cookies_serializer.rb
|   |   |-- filter_parameter_logging.rb
|   |   |-- inflections.rb
|   |   |-- mime_types.rb
|   |   |-- session_store.rb
|   |   `-- wrap_parameters.rb
|   |-- locales
|   |   `-- en.yml
|   |-- routes.rb
|   `-- secrets.yml
|-- config.ru
|-- db
|   `-- seeds.rb
|-- Gemfile
|-- Gemfile.lock
|-- lib
|   |-- assets
|   `-- tasks
|-- log
|-- public
|   |-- 404.html
|   |-- 422.html
|   |-- 500.html
|   |-- favicon.ico
|   `-- robots.txt
|-- Rakefile
|-- README.rdoc
|-- test
|   |-- controllers
|   |-- fixtures
|   |-- helpers
|   |-- integration
|   |-- mailers
|   |-- models
|   `-- test_helper.rb
|-- tmp
|   `-- cache
|       `-- assets
`-- vendor
    `-- assets
        |-- javascripts
        `-- stylesheets

Đây là kết quả bạn có được vậy mình sẽ bắt đầu chia sẽ theo cách mình hiểu những folder đó hoặc file đó sẽ chứa những gì, thường sẽ có ý nghĩa gì, có magic gì ở đó.

app

Nó tổ chức các thành phần chính ứng dụng của bạn và hầu hết code nằm ở trong thư mục này. Nó có các thư mục con chứa View, Controller, Model và một số thứ linh tinh xử lý logic khác thứ khác

app/assets

Chứa những file liên quan đến front-end của dự án như javascript, stylesheet, fonts, images

  • app/assets/images

Thường thì hình ảnh static của dự án sẽ được đặt tại đây. Những ảnh ở đây được gọi thông qua một helper là image_tag("image_name.jpg") và bạn không cần config đường dẫn gì tới file ảnh

  • app/assets/javascripts

Chứa các javascript file, và là một trong những nơi mà rails sẽ look up khi view nào đó tìm JS. Ở đây thì có một convention nhỏ cho việc đặt tên JS file ứng với controller. VD: books_controller.rb thì có file JS sẽ là books.js

  • app/assets/javascripts/application.js

Khi vào thì Rails sẽ tạo sẵn 1 file application.js là một file kê khai cho require javascript của toàn bộ ứng dụng. Rails sử dụng asset pipeline để biên dịch và và gọi assets. Điều này có nghĩa là file application.js là tệp mà bạn tham chiếu đến tệp tin JS cụ thể của ứng dụng, được thống nhất và nhỏ gọn trước khi gửi tới views.

Hãy cố gắng hạn chế càng nhiều càng tốt để không viết hàm xử lý javascript trong file này.

  • app/assets/stylesheets

Cũng như javascripts, những file css được đặt ở đây, việc đặt tên cũng giống như js luôn. Ở đây thì Rails bạn không cần quá bó buộc phải dùng .css đương nhiên có thể chơi sass hay scss tùy các bạn.

  • app/assets/stylesheets/application.css

file này là file kê khai cho cácstylesheet trong ứng dụng. Tương tự như application.js, các tệp được tham chiếu được để sử dụng trên view.

app/controllers

Đây như tên của folder nó là bộ não controller trong MVC chứa tất cả các file contrller. Việc đặt tên của file này bắt buộc phả theo quy tắt là số nhiều của tên model + "_controller". Ví dụ bạn có model User thì tên controller được đặt sẽ là users_controller.rb, nó theo khiểu snack_case. Còn trong file bạn tạo ra sẽ theo CamelCase tức là UsersController

Nếu cảm thấy khó nhớ các bạn có thể dùng generate script:

rails generate controller controller_name action_name

  • app/controllers/application_controller.rb

Đây là main controller mà các controller khác sẽ kế thừa. Những methods được viết ở đây có thể sử dụng ở các controller khác.

  • app/controllers/concerns

Concerns là những module mà có thể sử dụng ở nhiều controllers. Đây là một cách viết là cho code bạn DRY không bị lặp code nhiều chỗ cũng như có thể implementing tái sử dụng lại hàm trong thư mục

app/helpers

Đây là nơi thường được xem như tổng hợp các hàm viết ở view. thường thì ứng với mỗi controller bạn tạo sẽ có helper riêng với tên controller_name_helper.rb. Một ví dụ cho helper ở views các bạn có thể xem là hàm image_tag

  • app/helpers/application_helper.rb

Đây được xem là root helper. Cũng giống như application_controller, những hàm được viết ở đây sẽ "available" ở tất cả helper kế thừa từ nó cũng như là gọi tại các views

app/mailers

mailers chứa các hàm mail cho ứng dụng. Mailers cũng giống như controller và nó sẽ có các file views ở app/views/mailer_name/. Để tạo ra mailer bạn có thể dụng generate rails generate mailer MailerName

app/models

Tất cả model sẽ nằm trong app/models. Models đóng vai trò như đối tượng quan hệ sẽ mapping với database table chứa dữ liệu. Quy tắt đặt model sẽ là viết các object table trong DB ở dạng số ít

  • app/models/concerns

Giống như controller, method ở đây sẽ được dùng ở nhiều model files

app/views

Phần cuối cùng trong mô hình MVC là views. Những file cần hiển thị hoặc mails cũng như response api sẽ được viết trong phần này. Thường những file ở đây nếu là web sẽ là kết hợp giữu HTML và Ruby với extension sẽ là html.erb và được tổ chức dựa trên controller. Ví dụ, BooksController#index action sẽ có view tương ứng ở file

  • app/views/books/index.html.erb

Đó như là 1 convention khác của Rails. Ngoài ra các file layout sẽ được đặt tại đây

  • app/views/layouts

Nó như là một layout tổng và được kế thừa ở các views khác. Ngoài ra bạn cũng có thể dùng nhiều layout và tương ứng với controller tổng mà bạn muốn

bin

Chứa các file binstubs cho rails. Nó có thể dụng thay cho bundle exec <command>. Bạn có thể từ đây mà chạy các gem ở ứng dụng của bạn, hoặc chứa các script của dự án bạn. Mặc định sẽ có bundle, rails, rake, setup, spring.

config

Cũng như tên của nó đây là nơi các bạn có thể config dự án.

  • config/application.rb

File này chứa các config chính của ứng dụng như timezone, ngôn ngữ, một số setting như redis. Và những config ở đây sẽ chạy trên tất cả môi trường. Còn nếu bạn muốn thay đổi khác nhau ở các môi trường như là(devlopment, test, staging and production) thì trong folder config/environments

  • config/database.yml

Giữ các config database như hostname, port, user ,pass để connect vơi Database server

  • config/routes.rb

Declare các routes cho dự án rails

  • config/secrets.yml

File này chứa secret key ứng với từng môi trường của dự án

  • config/initializers/assets.rb

Đây là nơi chứa các asset pipeline. Bạn hoàn toàn có thể add thêm đường dẫn để rails biên dịch assets của bạn

  • config/locales

Nó sẽ chứa các file YAML cho từng ngôn ngữ. Bạn có thể đọc về i18n để sử dụng tốt viêc multilang cho dự án

db

Bạn có thể tìm kiếm toàn bộ những thứ liên quan đến Database ở đây. Nó sẽ chứa file migrate cũng như file schema của DB, ngoài ra còn có file seeds

  • db/seeds.rb

Đây là file mà các bạn có thể dùng để tạo dữ liệu cho Database.

  • Gemfile

Gemfile là nơi chứa các gem mà bạn cần dùng trong dự án. Đây là file bắt buộc của những dự án rails. Gem được coi là linh hồn của Rails và nó cũng chứa cả gem Rails trong đó.

  • Gemfile.lock

Gemfile.lock được generated bởi bundle install dựa vào file gem nó chứa đựng toàn bộ version của gem cũng như gem dependence tree có thể hiểu cách những gem phụ thuộc nhau. Tác dụng của nó là khóa rails app của bạn phụ thuộc vào đúng versions.

lib

Lib sẽ chứa những thư viện cho app. Có thể hiểu như là toàn bộ source thư viện như là một gem nào đó mà chỉ cho dự án của bạn.

  • lib/assets

chứa các library assets có thể hiểu như(scripts, stylesheets,images) mà không ở ứng dụng cụ thể

  • lib/tasks

Đây là nơi chứa các rake file để bạn có thể chạy lúc deploy hay trên server khi cần script thay đổi dữ liệu của app, hay những việc chạy thường xuyên tự động theo giờ bằng crontab

log

Chứa toàn bộ log file của dự án. Sẽ khác nhau tùy vào môi trường dự án

public

Chứa những file common cho web app. Thường thì sẽ dùng để làm sitemap handle một số http errors như là 404, 402, 500 và được tạo ra cùng với favicon và một robots.txt

test

Đây là folder chứa source test cho dự án hoặc bạn dùng Rspec thì sẽ có một folder spec

tmp

Đây được coi những một nơi chứa toàn bộ cache của dự án như build assets, mail nếu bạn dùng open_letterer. Bạn không cần chú ý nhiều tới nó

vendor/assets

Đay là nơi chứa các thư viện của bên thứ 3 như là cho javascript và css. Những file ở đây sẽ thành một phần của assets pipeline một cách tự động

Ngoài ra nếu dự án của bạn lớn sẽ có thêm một số thứ trong app như

app/services

Đây là nói mà các bạn viết một số thứ cho controller mà không biết đăt đâu

app/decorators

Giống như tên mẫu thiết kế bạn có một số gem như Drapper để phục vụ việc như viết full_name của user, hay ghép nhiều info của user. Thường có thể hiểu là cách để bỏ các views method ra khỏi model

app/workers

Chứa đựng một số job của app nếu dự án bạn cần background job để thực hiện một số hàm nặng với gem sidekiq, hoặc delayed_job Trên đây là toàn bộ những thư múc cũng như file khá quan trọng trong một dự án, hi vọng một phần nào giúp các bạn đỡ bỡ ngỡ khi làm việc với Rails và phần nào hiểu những mapping trong Rails chứ không hoàn toàn là magic


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí