2012-02-25 36 views
16

Tôi đang xem RailsCast về các liên kết đa hình. http://railscasts.com/episodes/154-polymorphic-association?view=asciicast

Có ba mô hình khác nhau Bài viết, Ảnh và Sự kiện mà mỗi người có nhận xét từ Comment.rb. (Bài viết, Ảnh và Sự kiện của mỗi article_id, photo_id và event_id). Trong danh sách các ý kiến ​​anh ấy có vấn đề tìm ra 3 mô hình để liệt kê các ý kiến ​​cho, vì vậy ông thực hiện điều này trong action index

def index 
    @commentable = find_commentable 
    @comments = @commentable.comments 
end 


def find_commentable 
    params.each do |name, value| 
    if name =~ /(.+)_id$/ 
     return $1.classify.constantize.find(value) 
    end 
    end 
    nil 
end 

Câu hỏi của tôi là, là những gì $1?

Trả lời

20

Theo Avdi Grimm from RubyTapas

$ 1 là một biến toàn cầu có thể được sử dụng trong mã sau:

if "foobar" =~ /foo(.*)/ then 
    puts "The matching word was #{$1}" 
end 

Output:

"Chữ khớp lệnh thanh"

Trong ngắn hạn, $ 1, $ 2, $ ... là các biến toàn cầu được sử dụng bởi một số hàm thư viện ruby ​​đặc biệt liên quan đến REGEX để cho các lập trình viên sử dụng các phát hiện trong các mã sau này.

See this để có thêm các biến có sẵn trong Ruby.

+0

chỉ được tạo khi sử dụng toán tử dấu ngã bằng nhau ?? –

+0

Có, '$ 1',' $ 2', v.v. phù hợp với nhóm thứ nhất, thứ hai, v.v. trong biểu thức chính quy cuối cùng - xem liên kết trong câu trả lời. Rubocop đề xuất sử dụng 'Regexp.last_match (n)' thay vào đó (chú ý n là 0, vì vậy '$ 1' ==' #last_match (0) ' – MatzFan

12

$1 là nhóm được so khớp từ cụm từ thông dụng phía trên /(.+)_id$/. Biến số $1 là chuỗi được khớp trong dấu ngoặc đơn.

Các vấn đề liên quan