2012-02-27 7 views
10

Powiedzmy, że chcę utworzyć stronę, która może wysłać zapytanie do żądanego obiektu za pomocą typu (string) i id (int).Model referencyjny z wprowadzeniem łańcucha znaków

/kwerendy? Type = ludzie & id = 1

byłoby mi sprowadzić

Person.find (1)

natomiast

/que ry? type = miast & id = 123

będzie pobierał mi

City.find (123)

Jednak mam problemy, jak przełożyć struny do żądanej klasa modelu.

Jedynym sposobem mogę myśleć jest

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

Jednak metoda ta będzie dość problematyczne, jeśli mam więcej typów modeli.

Czy istnieje lepszy sposób?

Dziękuję z góry,

+3

Jeśli spróbujesz zrobić to automatycznie może skończyć się w sytuacji, gdy atakujący może wysłać "/query? type = TOP_SECRET_TABLE & id = 1 "i uzyskać informacje, do których nie powinien mieć dostępu. Uważaj na to, co chcesz. – Sebi

+0

Jest to faktycznie przeznaczone do oznaczania obiektów przez ajax. Tak więc moim następnym krokiem będzie jak tag @ object.tags <<. Ale chciałem, aby pytanie było proste, więc zapytaj w ten sposób. W każdym razie dzięki! – rickypai

Odpowiedz

37

Spróbuj:

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

Edit:

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

Twój kod nie działa po wyjęciu z pudełka, ale ja go edytowałem i teraz działa! Wielkie dzięki! – rickypai

+0

Tak, literówka "wpisz" do "klass", dzięki. –

Powiązane problemy