Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Introspecting a model with a custom path throws an exception #87

Closed
lucaspiller opened this issue Mar 26, 2013 · 10 comments
Closed

Introspecting a model with a custom path throws an exception #87

lucaspiller opened this issue Mar 26, 2013 · 10 comments

Comments

@lucaspiller
Copy link

Given the following model:

class User
  collection_path "/companies/:company_id/users"
end

If in the console I do the following it works:

> User.all({company_id: 1}).first.id
1

However the following throws an error:

> User.all({company_id: 1}).first.id
Her::Errors::PathError: Missing :_company_id parameter to build the request path (/companies/:company_id/users).

This is because #inspect calls #request_path again, but without the parameters.

@remi
Copy link
Owner

remi commented Mar 31, 2013

Does you User model has a company_id attribute?

@lucaspiller
Copy link
Author

No it doesn't, it is just basic information, e.g.:

{
  "id": 54,
  "name": "Luca"
}

In my actual use case (as opposed to this example), the child can belong to multiple parents, so it doesn't make sense to have a single parent_id attribute. Maybe a better example would be Groups which have Users, and Users can belong to multiple Groups.

@remi
Copy link
Owner

remi commented Apr 3, 2013

Ah I see. Her is indeed calling the request path for each User resource.

In your actual use case, what URL would be called if you call the #save method on a user? PUT /users/:id (because the URL can’t depend on the parent since a user can belong to many parents)? In that case, you’d have to use the resource_path method:

class User
  collection_path "/companies/:company_id/users"
  resource_path "/users/:id"
end

@lucaspiller
Copy link
Author

Sorry for the delay, we've been busy busy recently...

Back to the issue, so the actual model in our case is read-only, so we don't need to worry about saving it. However if we did the the example you provided would be correct.

I think for now we'll just add some custom stuff to stop the #inspect method from doing this, in our case it's pretty simple to know what the URL is, so I don't think we need it there.

@remi
Copy link
Owner

remi commented Apr 15, 2013

I think we could just catch any exceptions when calling request_path here.

class User
  collection_path "/companies/:company_id/users"
end

user1 = User.find(1) # { "id": 1, "name": "Tobias Fünke", "company_id": 2 }
user1.inspect # => #<User(/companies/2/users/1) name="Tobias Fünke">

user2 = User.find(2) # { "id": 2, "name": "Maeby Fünke" }
user2.inspect # => #<User(<unknown path>) name="Maeby Fünke">

That makes sense, right?

@lucaspiller
Copy link
Author

That sounds good to me :)

@remi
Copy link
Owner

remi commented Apr 16, 2013

This commit should fix it. If I take my previous example again:

class User
  collection_path "/companies/:company_id/users"
end

user1 = User.find(1) # { "id": 1, "name": "Tobias Fünke", "company_id": 2 }
user1.inspect # => #<User(/companies/2/users/1) name="Tobias Fünke">

user2 = User.find(2) # { "id": 2, "name": "Maeby Fünke" }
user2.inspect # => #<User(<unknown path, missing `company_id`>) name="Maeby Fünke">

@pusewicz
Copy link

Great! It's been annoying for a long time ;)

@lucaspiller Can you verify and close the issue?

@remi
Copy link
Owner

remi commented Apr 22, 2013

@lucaspiller You should not be experiencing the issue with newer versions of her (0.6+). Please upgrade, test again and close this issue 😄 Thanks!

@lucaspiller
Copy link
Author

Works perfect, thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants