2012-06-10 24 views
7

Làm cách nào để thêm điều kiện băm vào một mảng *args trong Rails? Tôi không muốn dẫm lên giá trị ban đầu nếu có.Làm cách nào để thêm băm vào * args?

Ví dụ, tôi có một phương pháp mà nhận được một mảng:

def foo(*args) 
    # I want to insert {style: 'bar'} into args but only if !style.present? 
    bar(*args)        # do some other stuff 
end 

Tôi đã bắt đầu sử dụng extract_options và phương pháp reverse_merge cung cấp bởi ray:

def foo(*args) 
    options = args.extract_options!   # remove the option hashes 
    options.reverse_merge! {style: 'bar'} # modify them 
    args << options       # put them back into the array 
    bar(*args)        # do some other stuff 
end 

Nó hoạt động nhưng dường như tiết và không phải là rất ruby-ish. Tôi cảm thấy như tôi đã bỏ lỡ một cái gì đó.

+1

Có lý do nào bạn cần đặt lại trong danh sách 'args' không? Tôi tin rằng hai cái đầu tiên là phổ biến trong nguồn Rails. –

+1

Câu hỏi hay. Có, hàm 'foo' chuyển args vào một hàm khác. Tôi sẽ chỉnh sửa câu hỏi để cho thấy điều đó. Tôi đang viết một lớp FormBuilder, rất nhiều người trợ giúp gọi những người trợ giúp khác. – IAmNaN

Trả lời

7

Có, #extract_options! là cách để thực hiện điều đó trong Rails. Nếu bạn muốn thanh lịch hơn, bạn sẽ phải bí danh nó, hoặc tìm cách riêng của bạn để xử lý nhu cầu này, hoặc tìm kiếm đá quý bởi một người đã thực hiện nó.

+1

Cảm ơn bạn, tôi đánh giá cao phản hồi. – IAmNaN

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