Rails, получить класс от имени класса? - PullRequest
1 голос
/ 21 сентября 2010

У меня проблема здесь, когда я пытаюсь вызвать метод класса для объекта, который не известен ... э-э, я не уверен, как сформулировать это, я получаю: ресурс из URL, но я хочу запустить find и для другого параметра.

Как я могу сделать что-то вроде:

params[:resource].classify.find(params[:id])

Я имею в виду, что это не сработает, потому что params[:resource].classify будет строкой. Но как я могу запустить метод, как если бы это был Class, а не строка?

Следующее использовалось нормально, но гем friendly_id сделал все мои вызовы к записи, чтобы вернуть его friendly_id, а не фактический первичный ключ ... который полностью отстой.

Он делал что-то вроде этого, который работал просто отлично:

@vote = Vote.new({
  :vote => params[:direction] == 'up' ? true : false,
  :voteable_type => params[:resource].classify,
  :voteable_id => params[:id])
})

Но после добавления friendly_id мои пути теперь выглядят примерно так:

/things/my-thing-name/vote/up

вместо старого:

/things/328/vote/up

Так что теперь params[:id] больше не является внешним ключом.

Мысли

Ответы [ 2 ]

3 голосов
/ 21 сентября 2010

Я немного озадачен вашим вопросом, похоже, 2.

Для части 1 вы можете constantize. params[:resource].classify.constantize должен вернуть имя класса, для которого вы затем можете вызвать метод. Просто чтобы быть в безопасности, вы можете захотеть tableize перед constantize ing, просто чтобы убедиться, что такие вещи как "-" будут "_". Я упоминаю об этом только из-за того, что у вас настроена friendly_id.

Что касается второй части, я не знаю гем friendly_id, но, основываясь на описании того, как он работает в руководстве , ваша находка все равно будет работать нормально, если я не чего-то не хватает

3 голосов
/ 21 сентября 2010

Для начала "params [: resource] .classify" вам нужно сделать

params[:resource].constantize

Для второго, похоже, вы должны сделать что-то вроде:

@thing = Thing.find_by_friendly_id(params[:friendly_id])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...