ActiveSupport in Rails
Giới thiệu Sau khi cài đặt ứng dụng Rails, bạn sẽ thấy một số thư viện sau được cài kèm theo như sau: $ gem list actioncable ( 5.0 .0 .1 ) actionmailer ( 5.0 .0 .1 , 4.2 .6 ) actionpack ( 5.0 .0 .1 , 4.2 .6 ) actionview ( 5.0 .0 .1 , 4.2 .6 ) activejob ( ...
Giới thiệu
Sau khi cài đặt ứng dụng Rails, bạn sẽ thấy một số thư viện sau được cài kèm theo như sau:
$ gem list
actioncable (5.0.0.1) actionmailer (5.0.0.1, 4.2.6) actionpack (5.0.0.1, 4.2.6) actionview (5.0.0.1, 4.2.6) activejob (5.0.0.1, 4.2.6) activemodel (5.0.0.1, 4.2.6) activerecord (5.0.0.1, 4.2.6) activesupport (5.0.0.1, 4.2.7, 4.2.6) acts-as-taggable-on (4.0.0) addressable (2.4.0) adminlte2-rails (0.0.5) arel (7.1.4, 7.1.2, 6.0.3) autoprefixer-rails (6.5.1, 6.5.0, 6.4.1.1) aws_cf_signer (0.1.3) bcrypt (3.1.11, 3.1.7) ...
ActiveSuppot là gì?
Là tập hợp các hàm tiện ích được Rails 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, và vì thư viện chuẩn của ngôn ngữ nào cũng được coi là một phần của ngôn ngữ ấy nên nó mang lại cảm giác các hàm này có sẵn trong bản thân ngôn ngữ.
Các tiện ích trong ActiveSupport quá hay, nên nhiều người cứ tưởng chúng là các tính năng của Ruby, góp phần tạo nên triệu chứng biết Rails mà không biết Ruby!
Để dùng các hàm này trong chương trình Ruby bình thường (không phải là Rails), chỉ cần require 'activesupport' một cách tường minh.
Ví dụ một số hàm tiện ích của ActiveSupport
1. Chuyển đổi String
"post".pluralize # => "posts" "octopus".pluralize # => "octopi" "sheep".pluralize # => "sheep" "words".pluralize # => "words" "the blue mailman".pluralize # => "the blue mailmen" "elves".singularize # => "elf" "christmas_carol".camelize # => "ChristmasCarol" "christmas_carol".camelize(:lower) #=> "christmasCarol" "holiday_cheer".titleize # =>"Holiday Cheer" "AdventCalendar-2006".underscore # => "advent_calendar_2006" "santa_Claus".dasherize # => "santa-Claus" "Holiday::December::Christmas".demodulize #=> "Christmas" "SnowStorm".tableize # => "snow_storms" "snow_storms".classify # => "SnowStorm" "present_id".humanize # => "Present" "Present".foreign_key # => "present_id"
2. Tính số byte (Number)
2.6.megabytes # => 2726297.6
3. reverse_merge (Hash)
>> colors = { :foreground => 'red', :background => 'black' } => {:background=>"black", :foreground=>"red"} >> colors.merge(:background => 'green') => {:background=>"green", :foreground=>"red"} >> colors.reverse_merge(:background => 'green') => {:background=>"black", :foreground=>"red"}
4. Chuyển mảng thành câu
%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"
5. 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?
6. attr_accessor_with_default
class Homework # Đỡ phải viết initialize attr_accessor_with_default :sucks, true end assignment = Homework.new assignment.sucks # => true
7. cattr, mattr, class_inheritable_accessor**
Chắc bạn đã quen với attr_accessor của Ruby. ActiveSupport 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
8. 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.
Tham khảo
https://kipalog.com/posts/ActiveSupport--Vu-khi-bi-mat-cua-Rails