Loading resources from other than the default URL


#1

I often find myslef in the need to split one action into multiple different ones, mostly for index actions. Here’s an example, we have a /posts resource, where each post has multiple attributes. We might want to do

  • /posts - list of posts
  • /posts?query=foo fulltext search
  • /posts?tags=foo,bar,baz - search by tags
  • /posts?random - random post
  • /posts?random&limit=3 - 3 random posts
  • /posts?featured - featured posts
  • /posts?recommended - recommended posts for the current user

Now this is just the begining of a long list, and of course these can mix. In ideal world, these could be just be URLs, for example we could get published posts at /posts/published, but that’s not possible to do with Ember Data.

The result is that the backend looks like this

def index
  if params[:query]
    render json: Post.all
  elsif params[:tags]
    ...
  elsif ...
    # and the list goes on
end

Of course I would make a custom router that would dispatch based on the params, but that doesn’t feel RESTful at all. It kinda reminds me of the old PHP days of /index.php?action=foo&params=bar.

If we do decide to use custom routes, it forces us to go with store.load and $.ajax, for example

$.getJSON("/posts/published").then(function(data) {
  this.get("store").load(App.Post, data.post);
}.bind(this));

but what if we’re sideloading in this case? We basically need to do that manually.

$.getJSON("/posts/published").then(function(data) {
  var store = this.get("store");

  store.load(App.Post, data.post);
  store.load(App.Comment, data.comments);
}.bind(this));

Am I the only one experiencing this? I found that if the app is small-medium size, it isn’t such a problem to stick everything into one action, but once it grows and you have a lot of different ways of using the same resource, this approach becomes completely unmanagable.