Một trong những điều khiến việc làm việc với Rails trở nên tuyệt vời là đối với bất kỳ nhu cầu lập trình thông thường nào --- ủy quyền, quản trị trang web, thương mại điện tử, bạn đặt tên cho nó --- ai đó thông minh hơn bạn có thể đã viết mã giải pháp cho vấn đề của bạn và đóng gói nó dưới dạng một viên ngọc quý.
Bạn chắc chắn có thể thêm đá quý vào Gemfile của mình và tận dụng tối đa tính hữu ích của chúng mà không cần thực sự hiểu cách hoạt động của chúng, nhưng bạn có bao giờ tò mò làm cách nào để tất cả được kết nối với nhau không?
Ở đây, chúng ta sẽ xem xét kỹ hơn viên ngọc ủy quyền CanCan của Ryan Bates và trả lời các câu hỏi sau (nếu được hỏi rộng hơn, có thể áp dụng cho bất kỳ viên đá quý nào):
-
Mã cho CanCan được lưu trữ ở đâu?
-
can?
phương pháp được xác định? -
Khi nào / ở đâu / làm thế nào để Rails tải mã cho CanCan?
Đầu tiên, tôi có CanCan trong Gemfile của mình và tôi thực hiện bundle install
:
# Gemfile
gem "cancan", "~> 1.6.10"```
$ bundle install
Với Bundler, thực sự rất dễ dàng để xem bất kỳ viên ngọc cụ thể nào sống ở đâu. Chỉ cần sử dụng bundle show
:
$ bundle show cancan
/Users/jasonswett/.rvm/gems/ruby-2.0.0-p0/gems/cancan-1.6.10
Đó là vấn đề của câu hỏi số 1. Bây giờ can?
định nghĩa?
$ cd /Users/jasonswett/.rvm/gems/ruby-2.0.0-p0/gems/cancan-1.6.10
$ grep -r 'def can?' *
lib/cancan/ability.rb: def can?(action, subject, *extra_args)
lib/cancan/controller_additions.rb: def can?(*args)
Có vẻ như thực sự có hai can?
khác nhau chức năng. Cái mà chúng tôi quan tâm là lib/cancan/ability.rb
.
# lib/cancan/ability.rb
def can?(action, subject, *extra_args)
match = relevant_rules_for_match(action, subject).detect do |rule|
rule.matches_conditions?(action, subject, extra_args)
end
match ? match.base_behavior : false
end
Theo như những gì đang thực sự xảy ra ở đây, suy đoán của bạn cũng tốt như tôi, nhưng đó không phải là phần quan trọng. Bài học rút ra ở đây là nếu bạn gặp phải một số vấn đề với một viên ngọc, thì bây giờ bạn được cho là phải đào vào mã của viên đá quý để cố gắng tìm ra điều gì đang xảy ra.
Bây giờ chúng ta đã biết mã của một viên ngọc được lưu giữ ở đâu và làm thế nào để truy cập vào nó, làm thế nào Rails biết về một viên đá quý và khi nào nó tải mã của viên đá quý?
Điều này được đề cập trong một phần nhất định của tài liệu khởi tạo Rails. Đây là phần có liên quan:
Trong một ứng dụng Rails tiêu chuẩn, có một Gemfile khai báo tất cả các phụ thuộc của ứng dụng. config / boot.rb đặt ENV ['BUNDLE_GEMFILE'] vào vị trí của tệp này. Nếu Gemfile tồn tại, thì cần phải có gói / thiết lập.
Điều này xảy ra sớm trong quá trình khởi tạo:chính xác là bước thứ hai. Điều này có ý nghĩa vì nếu dự án của bạn phụ thuộc vào một viên ngọc nhất định, ai biết bạn có thể tham khảo nó ở đâu. Tốt hơn hãy tải nó càng sớm càng tốt để mã của nó có thể được sử dụng ở bất cứ đâu.