olivernn / poirot

mustaches in your rails
http://olivernn.github.com/poirot
108 stars 21 forks source link

Rails 4? #31

Open timscott opened 8 years ago

timscott commented 8 years ago

I'm finally upgrading an app to Rails 4 which relies heavily on Poirot. Upon server side render of a partial I'm getting:

undefined method `_partial_renderer' for #<ActionView::Renderer:0x007fde81364b08>

I assume this is because Rails 4 is not supported. Correct? What are my options?

olivernn commented 8 years ago

To be honest, I haven't looked at poirot in quite a few years now, so I'm not sure how much help I'm going to be in getting this working with Rails 4...

A quick look shows that Poirot::View knows nothing about Rails 4. My guess is the way that Rails 4 made locals available to a view renderer has changed. That'd be the place that I'd start looking anyway.

Let me know if you find anything, or better yet, open a PR with fixes. I'm unlikely to get much time to try and investigate and get this to work with Rails 4 anytime soon. Sorry, thats not very helpful I know :crying_cat_face:

timscott commented 8 years ago

For anyone else facing this problem, I switched to stache.

The migration can be pretty painless. On the server side, just follow the stache docs. On the client side you need a helper to match the poirot API:

var renderer = function(e) {
    var t = function(t, n) {
        return function(r) {
            return e(Mustache.to_html(t, r, n))
        }
    }
      , n = {
        _partials: {},
        _viewFactory: t
    };
    return e(document).ready(function() {
        e('script[type="text/html"]').each(function() {
            var t = e(this).html()
              , r = this.id.replace(/_([a-z])/g, function(e) {
                return e.replace("_", "").toUpperCase()
            }
            ).replace("Template", "");
            n._partials[r] = t,
            n[r] = n._viewFactory(t, n._partials)
        }
        )
    }),
    n
}
(jQuery)
  , Mustache = typeof module != "undefined" && module.exports || {};

Then replace poirot.myPartial() everywhere with renderer.myPartial().