Vinova tuyển lập trình viên Mobile & Web ở Hà Nội, lương $300-1000

Article: ActiveSupport: vũ khí bí mật của Rails 847

ngocdaothanh.myopenid.com 172
Over 3 years ago

Khi cài Rails (nếu cài xong rồi thì có thể kiểm tra bằng lệnh gem list), sẽ thấy Rails không phải là một gem duy nhất, mà gồm các thành phần:

  • actionpack: V và C (trong MVC)
  • activerecord: M
  • actionmailer: để gửi và nhận mail
  • activeresource: provider và consumer của web service theo kiểu REST
  • activesupport

Ngoài ActiveSupport (AS), các thành phần khác đều hướng đến việc xây dựng trang web theo mô hình MVC. Vậy AS là gì?

AS là gì?

Theo quảng cáo:

Active Support is a collection of various utility classes and standard library extensions that were found useful for Rails. All these additions have hence been collected in this bundle as way to gather all that sugar that makes Ruby sweeter.

Có nghĩa AS là tập hợp các hàm tiện ích được nhúng thẳng vào lớp của thư viện chuẩn của Ruby (như Array, String). Nhờ tính năng reopen của Ruby, việc nhúng này rất dễ dàng, mang lại cảm giác các hàm này có sẵn trong bản thân ngôn ngữ (vì ngôn ngữ = thư viện chuẩn).

Ý tưởng của AS quá hay, nên các framework của các ngôn ngữ khác (như C#, PHP) rất muốn nhái. Mặt trái của AS là người chưa nhiều kinh nghiệm cứ lầm tưởng các hàm này có sẵn trong Rails, góp phần tạo nên triệu chứng biết Rails mà không biết Ruby!

Tài liệu về tất cả các hàm ở đây (xem ở đây cũng được, nhưng hơi rối), bạn nên lục lọi đống tài liệu đấy, sẽ tìm thấy rất nhiều thứ thú vị. Để dùng các hàm này trong chương trình Ruby bình thường (không phải là Rails), cần require 'activesupport'.

Ví dụ về một số hàm tiện ích

Dưới đây là vài ví dụ nhằm tạo hưng phấn để bạn có hứng lục lọi tài liệu ở trên. Để thử nghiệm các đoạn mã ví dụ, nên dùng irb, nhớ require 'activesupport' trước.

Chuyển danh từ sang số nhiều, số ít (String)

"post".pluralize             # => "posts"
"octopus".pluralize # => "octopi"
"sheep".pluralize # => "sheep"
"words".pluralize # => "words"
"the blue mailman".pluralize # => "the blue mailmen"

Tính số byte (Number)

2.6.megabytes  # => 2726297.6

Biến thành câu (Array)

%w[a b c].to_sentence                            # => "a, b, and c"
%w[a b c].to_sentence(:connector => '&') # => "a, b, & c"
%w[a b c].to_sentence(:skip_last_comma => true) # => "a, b and c"

blank? (Object)

# Thay vì viết (hay gặp trong view)
if !address.nil? && !address.empty?
# Viết ngắn được thành
if !address.blank?

attr_accessor_with_default

class Homework
# Đỡ phải viết initialize
attr_accessor_with_default :sucks, true
end

assignment = Homework.new
assignment.sucks # => true

cattr*, mattr*, class_inheritable_accessor

Chắc bạn đã quen với attr_accessor của Ruby. AS cung cấp thêm cattr_accessor để khai báo accessor cho lớp. cattr_accessor tạo ra một biến chung cho tất cả lớp cùng cây thừa kế, còn class_inheritable_accessor tạo biến riêng cho từng lớp.

class P1
cattr_accessor :val
end

class C1 < P1
end

P1.val # => nil
C1.val # => nil
P1.val = 8
C1.val # => 8

class P2
class_inheritable_accessor :val
end

class C2 < P2
end

P2.val # => nil
C2.val # => nil
P2.val = 8
C2.val # => nil

returning (Object)

Giúp mã sáng sủa hơn vì làm rõ giá trị trả về là gì. 2 đoạn mã sau, cái sau sáng sủa hơn vì cho biết hàm sẽ trả về cái gì.

def change_state(object_id, new_state)
object = find(object_id)
object.state = new_state
object.save
object
end

def change_state(object_id, new_state)
returning find(object_id) do |object|
object.state = new_state
object.save
end
end

Với returning, ban đầu ta khởi tạo đối tượng sẽ trả về, rồi sửa (modify) dần dần nó cho đến khi được cái ưng ý, y như tạc một bức tượng.

delegate

Tham khảo Định luật nữ thần Demeterđây.

Tham khảo: Rails Rubyims Advent

Comments

You must login to be able to comment

Uploaded files

No file uploaded yet

You must login to be able to upload

Nhà tài trợ:

Mọi người đều tự do viết bài, sửa bài của người khác, và bình luận ở trang web này. Bạn muốn chủ động tạo bài mới để chia sẻ kinh nghiệm với mọi người? Xin click link ở dưới.

Create new content