12/08/2018, 17:43

5 Mẹo Ruby on Rails có thể bạn đã biết

Kể từ khi tôi bắt đầu làm việc với Ruby on Rails, và sau vài tháng sử dụng nó, tôi không thể ngừng tự hỏi khi tôi khám phá ra điều gì đó mới mẻ trong thế giới Ruby. Ruby luôn tạo ra các cách để làm cho một lập trình viên hạnh phúc, và đôi khi trong quá trình viết code chúng ta quên mất những điều ...

Kể từ khi tôi bắt đầu làm việc với Ruby on Rails, và sau vài tháng sử dụng nó, tôi không thể ngừng tự hỏi khi tôi khám phá ra điều gì đó mới mẻ trong thế giới Ruby. Ruby luôn tạo ra các cách để làm cho một lập trình viên hạnh phúc, và đôi khi trong quá trình viết code chúng ta quên mất những điều có sẵn ấy. Dưới đây tôi sẽ chỉ ra cho các bạn 5 mẹo mà có thể bạn không biết( hoặc đã biết rồi).

Đã bao nhiêu lần bạn viết những dòng code như thế này ?

... if params[:user] && params[:user][:address] && params[:user][:address][:somewhere_deep]

Hãy sử dụng "dig", và viết lại nó như thế này

... if params.dig(:user, :address, :somewhere_deep)

Trông có vẻ clear hơn nhỉ, dễ đọc, dễ sửa, dễ dùng. Các bạn có thể tìm hiểu rõ về dig trước khi sử dụng nó nhé.

Trong khá nhiều trường hợp chúng ta đã code những dòng đại loại thế này :

sort_options = [:by_date, :by_title, :by_author]
...
sort = sort_options.include?(params[:sort]) 
  ? params[:sort] 
  : :by_date
# Another option
sort = (sort_options.include?(params[:sort]) && params[:sort]) || :by_date

Nhìn có vẻ rườm rà rắc rối, nhưng thay vào đó chúng ta có thể sử dụng presence_in, và refactor lại đoạn code trên:

params[:sort].presence_in(sort_options) || :by_date

Trong một vài trường hợp khi chung ta nhúng tay vào một dự án cũ, có thể cả chục năm trước và nhìn thấy DB có các cột đặt tên 1 kiểu "lạ lùng" như NGAYTHANG, HOTEN .... khi ánh xạ vào ActiveRecord việc gọi các tên như vậy thường gây nhiều rắc rối, chúng ta có thể dễ dàng đặt lại tên cho chúng bằng alias_attribute:

alias_attribute :name, :HOTEN 

scpoe :by_name, -> name {where name: name}

Presence thì chắc các bạn gặp khá nhiều rồi nhỉ? Nó chỉ đơn giản là

object.present? ? object : nil

Một cách tiện lợi để không phải gọi ra một thuộc tính quan hệ dài dòng là sử dụng delegate.

class Profile < ApplicationRecord
  belongs_to :user
  delegate :email, to: :user
end
...
profile.email # equivalent to profile.user.email

nguồn : https://hackernoon.com/5-ruby-on-rails-tips-you-probably-dont-know-8b80b4a0890f

0