JP Silvashy
JP Silvashy

Reputation: 48525

Rails, get Class from Class name?

I have an issue here where I'm trying to call a class method on an object that is not known... err, I'm not sure how to phrase this I'm getting the :resource from the URL, but I want to run find on it for a differnt param as well.

How can I do something like:

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

I mean this won't work because the params[:resource].classify would be a string. But how can I run a method on it as if it was a Class and not a string?

The following used to work fine but the gem friendly_id has made all my calls to a record to return it's friendly_id and not its actual primary key... which totally sucks.

It was doing something like this, which worked just fine:

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

But since adding friendly_id my paths now look something like:

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

instead of the old way:

/things/328/vote/up

So now the params[:id] is no longer the foreign key.

Thoughts?

Upvotes: 1

Views: 3550

Answers (2)

theIV
theIV

Reputation: 25774

I'm a bit confused by your question, it seems like 2.

For part 1, you can constantize. params[:resource].classify.constantize should return the classname that you can then invoke a method on. Just to be safe, you might want to tableize before constantizeing, just to make sure things like "-" are going to be "_". I only mention this because of how you have your friendly_id set up.

As for part 2, I don't know the friendly_id gem, but based off of the description of how it works in the guide, your find should still work just fine unless I'm missing something.

Upvotes: 3

jordinl
jordinl

Reputation: 5239

For the first thing "params[:resource].classify" you need to do

params[:resource].constantize

For the second it looks like you should do something like:

@thing = Thing.find_by_friendly_id(params[:friendly_id])

Upvotes: 3

Related Questions