Hãy tưởng tượng bạn đang ngồi trong một buổi phỏng vấn, và nhà tuyển dụng hỏi: “Bạn có thể giải thích ORM trong Ruby on Rails là gì không?” Bạn sẽ trả lời như thế nào để gây ấn tượng và thể hiện kiến thức sâu rộng của mình? Đừng lo lắng! Bài viết này sẽ giúp bạn chuẩn bị cho những câu hỏi phỏng vấn Ruby on Rails từ cơ bản đến nâng cao. Hãy cùng khám phá và trang bị cho mình những kiến thức cần thiết để tự tin “chinh phục” nhà tuyển dụng!

Đọc bài viết sau đây để nắm vững:

  • Câu hỏi phỏng vấn Ruby on Rails cho Fresher
  • Câu hỏi phỏng vấn Ruby on Rails cho Junior và Middle Developer
  • Câu hỏi phỏng vấn Ruby on Rails cho Senior Developer

Ruby on Rails là gì?

Bạn có biết rằng Ruby on Rails đã từng được ví như “chiếc đũa thần” trong thế giới phát triển web không? Với khả năng giúp lập trình viên tạo ra các ứng dụng web mạnh mẽ một cách nhanh chóng, Rails đã trở thành lựa chọn ưu tiên của nhiều công ty công nghệ hàng đầu. Ruby on Rails (thường gọi là Rails) là một framework ứng dụng web mã nguồn mở được viết bằng ngôn ngữ lập trình Ruby.

Rails tuân theo mô hình MVC (Model-View-Controller), giúp việc phát triển ứng dụng web trở nên dễ dàng và hiệu quả hơn. Với Rails, lập trình viên có thể xây dựng các ứng dụng web mạnh mẽ với ít mã hơn, nhờ vào các quy ước và thư viện sẵn có.

Đọc thêm: Ruby on Rails là gì?

Câu hỏi phỏng vấn Ruby on Rails cho Fresher

Quy ước đặt tên trong Ruby on Rails là gì?

Rails tuân theo các quy ước đặt tên giúp tự động hóa nhiều tác vụ:

  • Model: Tên model được đặt ở dạng số ít và sử dụng CamelCase (ví dụ: Book, UserAccount).
  • Controller: Tên controller ở dạng số nhiều và kết thúc bằng Controller (ví dụ: BooksController, UserAccountsController).
  • Database Table: Tên bảng trong cơ sở dữ liệu ở dạng số nhiều và sử dụng snake_case (ví dụ: books, user_accounts).
  • File names: Tên file được đặt theo snake_case, ví dụ book.rb, user_account.rb.

Giải thích về ORM trong Ruby on Rails?

ORM (Object-Relational Mapping) trong Rails được thực hiện thông qua Active Record. Nó cho phép lập trình viên tương tác với cơ sở dữ liệu bằng cách sử dụng các đối tượng Ruby thay vì viết các câu lệnh SQL trực tiếp. Điều này giúp mã nguồn trở nên rõ ràng, dễ bảo trì và giảm thiểu lỗi do việc viết SQL thủ công.

Sự khác biệt giữa falsenil trong Ruby on Rails là gì?

  • false: Là một giá trị boolean, biểu thị cho “sai”.
  • nil: Đại diện cho “không có giá trị” hoặc “không tồn tại”.

Cả falsenil đều được coi là giá trị “falsy” trong Ruby, nghĩa là chúng sẽ trả về false trong biểu thức điều kiện. Tuy nhiên, chúng đại diện cho hai khái niệm khác nhau.

Sự khác nhau giữa String và Symbol là gì?

  • String (“hello”): Là một chuỗi ký tự có thể thay đổi được.
  • Symbol (:hello): Là một đối tượng bất biến, thường được sử dụng như khóa (key) trong hash hoặc để đại diện cho tên phương thức.

Symbols tiêu tốn ít bộ nhớ hơn và hiệu quả hơn khi sử dụng làm định danh hoặc khóa.

Vai trò của thư mục app/controllersapp/helpers là gì?

  • app/controllers: Chứa các controller, nơi xử lý các yêu cầu từ người dùng, tương tác với model và chọn view để hiển thị.
  • app/helpers: Chứa các helper module, cung cấp các phương thức hỗ trợ cho view, giúp mã nguồn trở nên gọn gàng và tái sử dụng.

Active Record trong Ruby on Rails là gì?

Active Record là thành phần ORM của Rails, cung cấp lớp giao tiếp giữa ứng dụng và cơ sở dữ liệu. Nó giúp lập trình viên thao tác với dữ liệu bằng cách sử dụng các đối tượng Ruby, hỗ trợ các chức năng như:

  • Định nghĩa mối quan hệ giữa các model.
  • Thực hiện các thao tác CRUD (Create, Read, Update, Delete).
  • Xác thực dữ liệu trước khi lưu vào cơ sở dữ liệu.

Rails Migration là gì?

Migration trong Rails là cách quản lý các thay đổi trong cấu trúc cơ sở dữ liệu theo thời gian. Thông qua migration, lập trình viên có thể:

  • Tạo, sửa đổi hoặc xóa bảng và cột.
  • Quản lý phiên bản của cơ sở dữ liệu.
  • Chia sẻ và đồng bộ hóa cấu trúc cơ sở dữ liệu giữa các thành viên trong nhóm.

Các chức năng của Rails Migration?

  • Tạo bảng mới: create_table.
  • Thêm cột mới: add_column.
  • Đổi tên cột hoặc bảng: rename_column, rename_table.
  • Xóa cột hoặc bảng: remove_column, drop_table.
  • Thêm chỉ mục: add_index.

Mixin trong Rails là gì?

Mixin trong Ruby là cách thêm các phương thức vào một lớp thông qua module. Bằng cách include hoặc extend module, lớp có thể sử dụng các phương thức được định nghĩa trong module đó. Mixin giúp:

  • Tái sử dụng mã nguồn.
  • Tránh việc đa kế thừa phức tạp.

Cách định nghĩa các loại biến trong Ruby (Instance, Global, và Class)?

  • Biến Instance: Bắt đầu bằng @, thuộc về một đối tượng cụ thể.
  • Biến Class: Bắt đầu bằng @@, được chia sẻ giữa tất cả các đối tượng của lớp.
  • Biến Global: Bắt đầu bằng $, có phạm vi toàn cục và có thể truy cập từ bất kỳ nơi nào.

Có bao nhiêu loại quan hệ liên kết trong một Model?

Trong Rails, có các loại quan hệ liên kết chính trong model:

  • belongs_to
  • has_one
  • has_many
  • has_many :through
  • has_one :through
  • has_and_belongs_to_many

Giàn giáo (Scaffolding) trong Rails là gì?

Scaffolding trong Rails là một tính năng cho phép tự động tạo ra mã nguồn cho các thao tác CRUD cơ bản (Create, Read, Update, Delete) dựa trên cấu trúc model. Nó tạo ra controller, view, và route cần thiết để quản lý dữ liệu một cách nhanh chóng.

Ba môi trường mặc định trong Rails là gì?

Ba môi trường mặc định trong Rails là:

  • development
  • test
  • production

Ba thành phần của Ruby on Rails là gì?

Ba thành phần chính của Rails là:

  • Active Record: ORM để tương tác với cơ sở dữ liệu.
  • Action Controller: Xử lý yêu cầu HTTP và phản hồi.
  • Action View: Tạo ra giao diện người dùng.

Câu hỏi phỏng vấn Ruby on Rails cho Junior và Middle Developer

Bạn đã nắm vững những kiến thức cơ bản về Ruby on Rails và muốn “nâng cấp” bản thân? Hãy cùng khám phá những câu hỏi phỏng vấn dành cho người có kinh nghiệm, giúp bạn thể hiện sự hiểu biết sâu rộng và khả năng ứng dụng thực tế của mình.

Gemfile trong Ruby on Rails là gì?

Gemfile là tệp tin quan trọng trong mỗi dự án Rails, nơi bạn khai báo tất cả các gem (thư viện Ruby) mà ứng dụng của bạn phụ thuộc. Bằng cách sử dụng Gemfile, bạn có thể quản lý các gem một cách dễ dàng, đảm bảo mọi thành viên trong nhóm phát triển đều sử dụng cùng một phiên bản gem, giúp dự án hoạt động ổn định và tránh xung đột phiên bản.

MVC là gì và nó hoạt động như thế nào?

MVC (Model-View-Controller) là mô hình kiến trúc phần mềm phân tách ứng dụng thành ba thành phần chính:

  • Model: Quản lý dữ liệu và logic nghiệp vụ. Đây là nơi bạn định nghĩa các lớp, xác thực dữ liệu và tương tác với cơ sở dữ liệu.
  • View: Chịu trách nhiệm hiển thị dữ liệu cho người dùng. View thường là các tệp HTML được kết hợp với mã Ruby để tạo ra nội dung động.
  • Controller: Xử lý các yêu cầu từ người dùng, tương tác với Model và chọn View phù hợp để hiển thị.

Trong Rails, khi người dùng gửi một yêu cầu, Router sẽ chuyển tiếp yêu cầu đó tới Controller thích hợp. Controller sẽ sử dụng Model để lấy hoặc cập nhật dữ liệu, sau đó chọn View để hiển thị kết quả cho người dùng.

Garbage Collection trong Ruby on Rails là gì?

Garbage Collection (GC) là cơ chế tự động quản lý bộ nhớ trong Ruby. GC giúp giải phóng bộ nhớ của các đối tượng không còn được sử dụng, ngăn chặn rò rỉ bộ nhớ và cải thiện hiệu suất của ứng dụng. Trong Rails, GC đảm bảo rằng ứng dụng của bạn không tiêu tốn quá nhiều bộ nhớ và hoạt động mượt mà hơn.

Ruby Class Library là gì?

Ruby Class Library là tập hợp các lớp và module được tích hợp sẵn trong ngôn ngữ Ruby. Chúng cung cấp các chức năng cơ bản như xử lý chuỗi, số, mảng, hash, cũng như các tác vụ phức tạp hơn như lập trình mạng, xử lý file và luồng. Việc sử dụng các thư viện này giúp lập trình viên tiết kiệm thời gian và công sức, tập trung vào phát triển logic nghiệp vụ thay vì xây dựng lại các chức năng cơ bản.

DRY (Don’t Repeat Yourself) code là gì?

DRY là nguyên tắc lập trình khuyến khích việc tránh lặp lại mã nguồn. Thay vì viết cùng một đoạn mã ở nhiều nơi, bạn nên trừu tượng hóa và tái sử dụng mã thông qua các phương thức, lớp hoặc module. Điều này giúp:

  • Giảm thiểu lỗi: Ít mã hơn đồng nghĩa với ít chỗ cho lỗi xảy ra.
  • Dễ bảo trì: Khi cần thay đổi, bạn chỉ cần cập nhật một nơi duy nhất.
  • Mã nguồn sạch sẽ: Giúp mã dễ đọc và dễ hiểu hơn.

Lợi ích của việc sử dụng Ruby on Rails?

Ruby on Rails mang lại nhiều lợi ích cho lập trình viên và doanh nghiệp:

  • Phát triển nhanh chóng: Với nhiều công cụ và thư viện sẵn có, bạn có thể xây dựng ứng dụng một cách nhanh chóng.
  • Cộng đồng lớn: Rails có một cộng đồng năng động, cung cấp nhiều tài liệu, gem và hỗ trợ khi bạn gặp vấn đề.
  • Nguyên tắc “Convention over Configuration”: Giảm thiểu việc cấu hình, giúp bạn tập trung vào logic nghiệp vụ.
  • Bảo mật tích hợp: Rails tích hợp nhiều biện pháp bảo mật mặc định, giúp bảo vệ ứng dụng khỏi các lỗ hổng phổ biến.

Nested Layout trong Ruby on Rails là gì?

Nested Layout cho phép bạn sử dụng một layout bên trong một layout khác. Điều này hữu ích khi bạn có nhiều phần của ứng dụng chia sẻ chung một giao diện, nhưng cũng có những phần riêng biệt. Bằng cách sử dụng nested layout, bạn có thể:

  • Tái sử dụng giao diện: Giảm thiểu việc lặp lại mã HTML.
  • Tổ chức cấu trúc giao diện rõ ràng hơn.
  • Dễ dàng thay đổi giao diện tổng thể mà không ảnh hưởng đến các phần tử con.

Vai trò của loadrequire trong Ruby?

  • require: Dùng để nạp một thư viện hoặc tệp tin chỉ một lần duy nhất. Nếu bạn gọi require nhiều lần cho cùng một tệp, Ruby sẽ chỉ nạp nó một lần.
  • load: Dùng để nạp và thực thi một tệp tin mỗi khi nó được gọi. Điều này có nghĩa là nếu bạn thay đổi tệp tin và gọi load lại, các thay đổi sẽ được áp dụng.

Lệnh delete trong Ruby on Rails hoạt động như thế nào?

Lệnh delete được sử dụng để xóa một bản ghi khỏi cơ sở dữ liệu mà không kích hoạt các callback hoặc xác thực:

# Xóa bản ghi mà không kích hoạt callback
@user.delete

Ngược lại, lệnh destroy sẽ xóa bản ghi và kích hoạt các callback liên quan:

# Xóa bản ghi và kích hoạt callback
@user.destroy

Cách tạo comment trong code Ruby?

Để tạo comment trong Ruby, bạn sử dụng dấu thăng # cho comment một dòng. Trong thực tế, nên sử dụng # cho mỗi dòng comment để tăng tính nhất quán.

# Đây là một comment trong Ruby

Hoặc sử dụng =begin=end cho comment nhiều dòng:

=begin
Đây là một
comment nhiều dòng
trong Ruby
=end

Sự khác biệt giữa dấu nháy đơn và dấu nháy kép trong chuỗi là gì?

  • Dấu nháy đơn ‘…’: Chuỗi được tạo ra sẽ giữ nguyên nội dung bên trong, không xử lý các ký tự đặc biệt hoặc biến.
  • Dấu nháy kép “…”: Ruby sẽ xử lý chuỗi, bao gồm việc thay thế biến và các ký tự đặc biệt như \n, \t.

Ví dụ:

name = 'Ruby'
puts 'Hello, #{name}'  # Output: Hello, #{name}
puts "Hello, #{name}"  # Output: Hello, Ruby

Gems và Gemset trong Ruby on Rails là gì?

  • Gems: Là các thư viện hoặc phần mở rộng được đóng gói, giúp bổ sung chức năng cho ứng dụng Ruby của bạn. Bạn có thể cài đặt gem thông qua gem install hoặc khai báo trong Gemfile và sử dụng bundle install.
  • Gemset: Là một tính năng của RVM (Ruby Version Manager) hoặc rbenv với plugin, cho phép tạo các tập hợp gem riêng biệt cho từng dự án, giúp quản lý gem dễ dàng hơn.

Các loại Filters trong Rails là gì?

Filters trong Rails được sử dụng trong Controller để thực thi mã trước hoặc sau một action cụ thể:

  • before_action: Thực thi trước khi action được gọi.
  • after_action: Thực thi sau khi action hoàn thành.
  • around_action: Bao quanh action, cho phép thực thi mã trước và sau action.

Ví dụ:

class ApplicationController < ActionController::Base
  before_action :authenticate_user
end

Helpers trong Ruby on Rails và cách sử dụng chúng như thế nào?

Helpers là các module chứa các phương thức hỗ trợ cho View, giúp bạn tái sử dụng mã và giữ cho View sạch sẽ. Bạn có thể định nghĩa helpers trong app/helpers hoặc trực tiếp trong Controller.

Ví dụ, tạo một helper để định dạng ngày:

module ApplicationHelper
  def format_date(date)
    date.strftime("%d/%m/%Y")
  end
end

Trong View, bạn có thể sử dụng:

<p>Ngày tạo: <%= format_date(@post.created_at) %></p>

Sự khác biệt giữa renderredirect_to là gì?

  • render: Hiển thị một view mà không thay đổi URL trên trình duyệt. Thường được sử dụng khi bạn muốn hiển thị lại form với thông báo lỗi.
  • redirect_to: Chuyển hướng người dùng tới một URL khác, yêu cầu trình duyệt thực hiện một yêu cầu HTTP mới. Thường được sử dụng sau khi tạo hoặc cập nhật thành công một bản ghi.

Ví dụ:

def create
  @post = Post.new(post_params)
  if @post.save
    redirect_to @post
  else
    render :new
  end
end

Câu hỏi phỏng vấn Ruby on Rails dành cho Senior Developer

Đối với những lập trình viên có kinh nghiệm, việc hiểu sâu và áp dụng những tính năng nâng cao của Rails là điều cần thiết. Dưới đây là những câu hỏi giúp bạn thể hiện kiến thức chuyên sâu của mình.

Active Job trong Ruby on Rails là gì?

Active Job là một framework tích hợp trong Rails để khai báo, quản lý và thực thi các tác vụ chạy nền (background jobs). Nó cung cấp giao diện thống nhất cho các backend xử lý hàng đợi như Sidekiq, Resque, Delayed Job. Bằng cách sử dụng Active Job, bạn có thể:

  • Gửi email.
  • Xử lý các tác vụ nặng mà không làm gián đoạn trải nghiệm người dùng.
  • Lập lịch các tác vụ định kỳ.

Sự khác biệt giữa after_saveafter_commit là gì?

  • after_save: Callback được gọi sau khi một đối tượng được lưu (cả khi tạo mới và cập nhật), nhưng trước khi giao dịch được cam kết vào cơ sở dữ liệu. after_save có thể được gọi nhiều lần nếu có nhiều thao tác save trong cùng một giao dịch.
  • after_commit: Callback được gọi sau khi giao dịch đã được cam kết thành công vào cơ sở dữ liệu. Điều này đảm bảo rằng dữ liệu đã thực sự được lưu và phù hợp cho các tác vụ như gửi email hoặc cập nhật các hệ thống bên ngoài. after_commit chỉ được gọi một lần sau khi giao dịch hoàn tất thành công.

Asset Pipeline trong Rails là gì?

Asset Pipeline là một framework trong Rails giúp quản lý và nén các tài nguyên tĩnh như CSS, JavaScript và hình ảnh. Nó cung cấp:

  • Tiền xử lý: Cho phép viết CSS bằng Sass hoặc Less, viết JavaScript bằng CoffeeScript.
  • Nén và gộp tệp: Giảm số lượng yêu cầu HTTP và kích thước tệp, cải thiện hiệu suất tải trang.
  • Fingerprints: Thêm chuỗi hash vào tên tệp để hỗ trợ caching hiệu quả.

Callback trong Ruby on Rails là gì?

Callbacks là các phương thức được gọi tại các thời điểm cụ thể trong vòng đời của một đối tượng Active Record, như trước khi tạo, sau khi cập nhật, hoặc trước khi xóa. Chúng cho phép bạn thêm logic tùy chỉnh vào quá trình xử lý dữ liệu.

Ví dụ:

class User < ApplicationRecord
  before_save :normalize_name

  private

  def normalize_name
    self.name = name.downcase.titleize
  end
end

Các loại Callbacks trong Ruby on Rails là gì?

Các loại callback phổ biến:

  • before_validation, after_validation
  • before_save, around_save, after_save
  • before_create, around_create, after_create
  • before_update, around_update, after_update
  • before_destroy, around_destroy, after_destroy
  • after_commit, after_rollback

Polymorphic Association trong Rails là gì?

Polymorphic Association cho phép một model liên kết với nhiều model khác nhau thông qua một interface chung. Ví dụ, model Comment có thể thuộc về Post, Photo, hoặc bất kỳ model nào khác.

Cách thiết lập:

class Comment < ApplicationRecord
  belongs_to :commentable, polymorphic: true
end

class Post < ApplicationRecord
  has_many :comments, as: :commentable
end

class Photo < ApplicationRecord
  has_many :comments, as: :commentable
end

Sự khác biệt giữa has_many :throughhas_and_belongs_to_many là gì?

  • has_and_belongs_to_many (HABTM): Thiết lập mối quan hệ nhiều-nhiều trực tiếp giữa hai model thông qua một bảng join mà không có model tương ứng. Không thể thêm thuộc tính hoặc logic vào bảng join.
  • has_many :through: Thiết lập mối quan hệ nhiều-nhiều thông qua một model trung gian. Cho phép bạn thêm thuộc tính, xác thực và callback vào model trung gian này.

Nên sử dụng has_many :through khi:

  • Bạn cần lưu trữ thêm thông tin trong bảng join.
  • Bạn muốn quản lý mối quan hệ phức tạp hơn.

Active Storage trong Ruby on Rails là gì?

Active Storage là một framework tích hợp trong Rails 5.2 trở lên, giúp quản lý việc upload và lưu trữ file một cách dễ dàng. Nó hỗ trợ lưu trữ file trên nhiều dịch vụ như:

  • Local disk
  • Amazon S3
  • Google Cloud Storage

Với Active Storage, bạn có thể:

  • Đính kèm một hoặc nhiều file vào model.
  • Dễ dàng chuyển đổi giữa các dịch vụ lưu trữ.
  • Xử lý hình ảnh (thay đổi kích thước, chuyển đổi định dạng).

Accessor Methods trong Ruby là gì?

Accessor Methods là các phương thức giúp truy cập và thay đổi giá trị của biến instance. Ruby cung cấp các macro để tạo các phương thức này một cách tự động:

  • attr_reader: Tạo phương thức getter.
  • attr_writer: Tạo phương thức setter.
  • attr_accessor: Tạo cả getter và setter.

Ví dụ:

class User
  attr_accessor :name
end

user = User.new
user.name = "Alice"
puts user.name  # Output: Alice

Sự khác biệt giữa supersuper() trong Ruby là gì?

  • super: Gọi phương thức cùng tên ở lớp cha với tất cả các tham số được truyền vào phương thức hiện tại.
  • super(): Gọi phương thức cùng tên ở lớp cha nhưng không truyền bất kỳ tham số nào.

Ví dụ:

class Parent
  def greet(message)
    puts message
  end
end

class Child < Parent
  def greet(message)
    super       # Truyền tham số message lên phương thức cha
  end
end

Các loại Association trong Rails là gì?

Rails hỗ trợ các loại association sau:

  • belongs_to
  • has_one
  • has_many
  • has_many :through
  • has_one :through
  • has_and_belongs_to_many

Skip Callback trong Rails hoạt động như thế nào?

Bạn có thể bỏ qua các callback trong Rails bằng cách sử dụng skip_callback. Điều này hữu ích khi bạn muốn tạm thời vô hiệu hóa một callback cụ thể.

Tuy nhiên, cần lưu ý rằng việc sử dụng skip_callback có thể ảnh hưởng đến toàn bộ lớp và có thể gây ra hậu quả không mong muốn nếu không được sử dụng cẩn thận. Ngoài ra, trong Rails 5 trở lên, cú pháp của skip_callback đã thay đổi và việc sử dụng callback cũng cần tuân theo các quy ước mới.

Cập nhật cú pháp cho Rails 5 trở lên:

Trong Rails 5+, bạn cần chỉ định các tùy chọn khi sử dụng skip_callback. Ví dụ:

class User < ApplicationRecord
  before_save :normalize_name
end

# Bỏ qua callback :normalize_name
User.skip_callback(:save, :before, :normalize_name)

Khuyến cáo sử dụng conditional callbacks:

Thay vì bỏ qua callback, bạn có thể sử dụng các điều kiện để kiểm soát khi nào callback được thực thi:

before_save :normalize_name, if: :should_normalize_name?

private

def should_normalize_name?
  # Điều kiện để thực thi callback
end

Concerns trong Rails là gì?

Concerns là cách để chia sẻ mã nguồn giữa các model hoặc controller trong Rails. Chúng là các module được đặt trong app/models/concerns hoặc app/controllers/concerns. Sử dụng Concerns giúp:

  • Tái sử dụng mã nguồn.
  • Giữ cho model và controller gọn gàng.
  • Tổ chức mã nguồn một cách logic.

Ví dụ:

# app/models/concerns/trackable.rb
module Trackable
  extend ActiveSupport::Concern

  included do
    before_create :set_created_by
  end

  def set_created_by
    self.created_by = Current.user.id
  end
end

# app/models/post.rb
class Post < ApplicationRecord
  include Trackable
end

Lệnh destroy trong Ruby on Rails hoạt động như thế nào?

Lệnh destroy xóa một bản ghi khỏi cơ sở dữ liệu và kích hoạt các callback liên quan (như before_destroy, after_destroy). Nó cũng sẽ xóa các bản ghi liên quan dựa trên các tùy chọn dependent trong association.

Ví dụ:

@user.destroy  # Xóa người dùng và kích hoạt callback

Ruby hỗ trợ Multiple Inheritance và Single Inheritance như thế nào?

  • Single Inheritance: Ruby hỗ trợ kế thừa đơn, nghĩa là một lớp chỉ có thể kế thừa từ một lớp cha duy nhất.
  • Multiple Inheritance: Ruby không hỗ trợ kế thừa đa nhưng cung cấp module và mixin để mô phỏng hành vi này. Bằng cách include hoặc extend các module, bạn có thể thêm các phương thức vào lớp.

Hash trong Ruby on Rails là gì?

Hash là một cấu trúc dữ liệu lưu trữ các cặp key-value. Trong Ruby, hash được sử dụng rộng rãi để truyền tham số, cấu hình và lưu trữ dữ liệu.

Ví dụ:

person = { name: "Bob", age: 30 }
puts person[:name# Output: Bob

Sự khác biệt giữa Array#eachArray#map là gì?

each: Duyệt qua từng phần tử trong mảng và thực thi một khối mã cho mỗi phần tử. Không trả về mảng mới.

[1, 2, 3].each { |n| puts n }

map: Duyệt qua từng phần tử, thực thi khối mã và trả về một mảng mới chứa kết quả.

squares = [1, 2, 3].map { |n| n * n }  # squares = [1, 4, 9]

Phương thức self.upself.down dùng để làm gì?

Trong các migration cũ, self.upself.down được sử dụng để định nghĩa cách áp dụng và hoàn tác thay đổi cơ sở dữ liệu.

  • self.up: Định nghĩa các thay đổi cần áp dụng.
  • self.down: Định nghĩa cách hoàn tác các thay đổi.

Trong các phiên bản Rails mới, bạn có thể sử dụng change thay thế cho updown.

Ví dụ về sử dụng change:

class AddEmailToUsers < ActiveRecord::Migration[6.1]
  def change
    add_column :users, :email, :string
  end
end

Khi cần sử dụng updown:

Nếu thay đổi không thể đảo ngược tự động, bạn nên sử dụng updown:

class ChangeDataTypeForPrice < ActiveRecord::Migration[6.1]
  def up
    change_column :products, :price, :string
  end

  def down
    change_column :products, :price, :integer
  end
end

yield trong Ruby on Rails là gì?

yield được sử dụng trong phương thức để gọi đến một khối mã được truyền vào khi gọi phương thức đó. Trong Rails, yield thường được sử dụng trong layout để chèn nội dung của view.

Ví dụ:

<!-- layout.html.erb -->
<html>
<head>
  <title>My App</title>
</head>
<body>
  <%= yield %>
</body>
</html>

Closure trong Ruby là gì?

Trong Ruby, closure là một khối mã (code block) có khả năng “ghi nhớ” ngữ cảnh nơi nó được định nghĩa, bao gồm các biến cục bộ. Điều này cho phép khối mã truy cập và sử dụng các biến ngoài phạm vi hiện tại khi được thực thi sau này. Closure giúp bạn truyền các khối mã linh hoạt trong chương trình và thực hiện chúng với ngữ cảnh ban đầu.

Trong Ruby, closure được thực hiện thông qua:

  • Block: Khối mã không tên được truyền vào phương thức, sử dụng {} hoặc do…end.
  • Proc: Đối tượng lưu trữ một block, có thể gán vào biến hoặc truyền làm tham số.
  • Lambda: Một dạng đặc biệt của Proc với cách xử lý tham số và return khác biệt.

Ví dụ sử dụng Proc làm closure:

def multiplier(factor)
  Proc.new { |n| n * factor }
end

times_two = multiplier(2)
puts times_two.call(5# Output: 10

Trong ví dụ trên, times_two là một closure giữ lại biến factor với giá trị 2, cho phép nhân bất kỳ số nào với 2 khi gọi phương thức call.

Ứng dụng của closure:

  • Callback và Event Handling: Truyền hành vi tùy chỉnh vào phương thức.
  • Lập trình hàm: Tạo các hàm bậc cao, hỗ trợ kỹ thuật như currying.
  • Tái sử dụng mã: Viết mã linh hoạt và dễ bảo trì hơn.

Closure là một khái niệm mạnh mẽ trong Ruby, giúp bạn viết mã ngắn gọn, linh hoạt và biểu đạt hơn.

Các mẹo phỏng vấn và chuẩn bị cho Ruby on Rails

Để thành công trong buổi phỏng vấn về Ruby on Rails, bạn cần không chỉ nắm vững kiến thức kỹ thuật mà còn phải chuẩn bị kỹ lưỡng về mọi mặt. Dưới đây là một số mẹo giúp bạn tự tin và gây ấn tượng tốt với nhà tuyển dụng:

Hiểu rõ về Ruby và Rails:

  • Nắm vững kiến thức cơ bản: Đảm bảo bạn hiểu rõ cú pháp Ruby, cấu trúc của Rails, và cách hai yếu tố này kết hợp với nhau.
  • Cập nhật phiên bản mới nhất: Rails liên tục cập nhật và cải tiến; hãy đảm bảo bạn biết về các tính năng mới và sự thay đổi trong các phiên bản gần đây.
  • Ôn tập với 17 tài liệu học Ruby on Rails mới nhất.

Thực hành thực tế:

  • Xây dựng dự án cá nhân: Tạo một hoặc nhiều ứng dụng web sử dụng Rails để thể hiện kỹ năng của bạn.
  • Đóng góp cho mã nguồn mở: Tham gia vào các dự án trên GitHub để tích lũy kinh nghiệm và thể hiện sự chủ động.

Chuẩn bị các câu hỏi phỏng vấn:

  • Ôn tập các câu hỏi kỹ thuật: Sử dụng danh sách câu hỏi trong bài viết này để luyện tập trả lời.
  • Thực hành giải thích khái niệm: Hãy tập giải thích các khái niệm phức tạp một cách đơn giản và dễ hiểu.
  • Luyện tập thuật toán: Mặc dù Rails tập trung vào phát triển ứng dụng web, việc hiểu biết về thuật toán và cấu trúc dữ liệu vẫn rất quan trọng.
  • Giải quyết các bài tập lập trình: Sử dụng các trang web như LeetCode, HackerRank để rèn luyện kỹ năng.

Hiểu về công ty và vị trí ứng tuyển:

  • Nghiên cứu công ty: Tìm hiểu về sản phẩm, dịch vụ, và công nghệ mà công ty sử dụng.
  • Chuẩn bị câu hỏi cho nhà tuyển dụng: Thể hiện sự quan tâm bằng cách đặt những câu hỏi liên quan đến dự án hoặc văn hóa công ty.

Cải thiện kỹ năng mềm:

  • Kỹ năng giao tiếp: Khả năng truyền đạt ý tưởng rõ ràng và hiệu quả là rất quan trọng.
  • Làm việc nhóm: Hãy chuẩn bị để thảo luận về kinh nghiệm làm việc nhóm và cách bạn giải quyết xung đột.
  • Giữ bình tĩnh và tự tin: Thực hành các kỹ thuật giảm căng thẳng như hít thở sâu.
  • Tích cực và nhiệt tình: Thể hiện đam mê của bạn đối với lập trình và Ruby on Rails.

Kỳ vọng gì ở buổi phỏng vấn:

  • Câu hỏi về kinh nghiệm thực tế: Nhà tuyển dụng có thể hỏi về các dự án bạn đã làm, vai trò cụ thể của bạn, và kết quả đạt được.
  • Bài tập coding trực tiếp: Có thể bạn sẽ được yêu cầu viết mã ngay trong buổi phỏng vấn, hãy chuẩn bị cho điều này.
  • Thảo luận về kiến trúc và thiết kế: Bạn có thể được hỏi về cách bạn thiết kế một ứng dụng hoặc giải quyết một vấn đề kỹ thuật cụ thể.

Tổng kết câu hỏi phỏng vấn Ruby on Rails

Chúng ta vừa cùng nhau khám phá hơn 30 câu hỏi phỏng vấn Ruby on Rails từ cơ bản đến nâng cao. Việc nắm vững những kiến thức này không chỉ giúp bạn tự tin hơn trong các buổi phỏng vấn mà còn củng cố kỹ năng lập trình của bạn. Chúc bạn thành công và sớm đạt được vị trí mong muốn với Ruby on Rails!