2012-02-27 41 views
10

Cho phép nói rằng tôi muốn tạo một trang có thể truy vấn đối tượng mong muốn bằng loại (chuỗi) và id (int).Tham chiếu Mẫu có đầu vào Chuỗi

/truy vấn loại? = Người & id = 1

sẽ lấy tôi

Person.find (1)

trong khi

/que ry? type = thành phố & id = 123

sẽ lấy tôi

City.find (123)

Tuy nhiên, tôi có vấn đề như thế nào để dịch dây vào mong muốn lớp mô hình.

Cách duy nhất tôi có thể nghĩ đến là

case params[:type] 
when 'people' 
    @object = Person.find(params[:id]) 
when 'cities' 
    @object = City.find(params[:id]) 
end 

Tuy nhiên, phương pháp này sẽ được khá nhiều vấn đề nếu tôi có nhiều loại mô hình.

Có cách nào tốt hơn không?

Cảm ơn bạn trước,

+3

Nếu bạn cố gắng làm điều này tự động bạn có thể kết thúc trong một tình huống mà một kẻ tấn công có thể gửi "/query? type = TOP_SECRET_TABLE & id = 1 "và nhận thông tin anh ấy không được phép truy cập. Hãy coi chừng những gì bạn muốn. – Sebi

+0

Nó thực sự có nghĩa là cho ajax cho các đối tượng gắn thẻ. Vì vậy, bước tiếp theo của tôi sẽ giống như thẻ @ object.tags <<. Nhưng muốn giữ câu hỏi đơn giản nên hỏi theo cách này. Dù sao cũng cảm ơn! – rickypai

Trả lời

37

Hãy thử:

klass = params[:type] 
klass.singularize.classify.constantize.find(params[:id]) 

Edit:

@object = params[:type].singularize.classify.constantize.find(params[:id]) 
+0

Mã của bạn không hoạt động ra khỏi hộp, nhưng tôi đã chỉnh sửa và giờ nó hoạt động! Cảm ơn rất nhiều! – rickypai

+0

Vâng, một typo 'type' to 'klass', cảm ơn. –

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