Chris Oliver


238,210 Experience
17 Lessons Completed
260 Questions Solved


Thanks man! :)

I'll have to do an episode on jQuery.turbolinks soon. Also Turbolinks 5 as well since that should be coming out in the near future.

I'd recommend checking out jQuery.turbolinks. It's a gem that basically maps the jQuery ready function to the Turbolinks page:change function (and some others) to make all your jQuery code run as expected. It's one of those things that makes using Turbolinks a lot simpler and fixes some of the issues like this.

That should do the trick without having to write any extra code. Let me know if that works for you!

Posted in Create shopify type of Application

I would recommend checking out Liquid templates (which was made by Shopify!) for customizing the templates.

They've also got a bunch of other very helpful gems that they've open sourced which can really help. Take a look at their Github profile for those.

Posted in Testing Turbolinks 3 partial replacement

I just was looking into Turbolinks 5 yesterday and it looks like they've ditched partial replacement because it's sort of trivial gains in comparison to the complexity it adds (their claim) and I kinda agree.

I'm curious, do you know if poltergeist is executing the JS? A previous project I was using ran tests with Firefox and that made it a bit easier to pause and debug what was going wrong with them. Often it was something like that.

And one other thing I thought of, is you can sometimes do a hybrid approach, where you don't really uses an instance of each class, but more the class as a singleton representing whatever the current object is, doing all of it's work relative to the event handler. You can have more generic React-like classes that way that end up being able to take advantage of both the class and the live handlers from jQuery.

Yeah, that's a great question. I generally take that first approach, or something like it. Sometimes rather than doing it on the response, I'll do this beforehand, but each time you'll need to instantiate the class for every record inserted. I didn't find it to be that much of an issue from building things like this, but it can be a little extra work. In any case, dynamically adding things like this without using something like React is going to usually entail some extra overhead like that.

Yo! What's happening is basically:

  • Create the new quote
  • After_save fires, attempts to schedule.
  • If that fails, you update the record, causing the after save to run again
  • If it doesn't fail, when the record does get published, you update the record, causing the after_save callback to fire once more
  • This is going to obviously throw an error on Twitter, etc for duplicate posts at some point causing your code to update the record again that there was an error, fire the after_save callback and then attempt to post again.

My suggestion here would be actually to remove the after_save callback and do this explicitly in your controller. You'll save yourself some trouble doing that. You can also set it up so that if it fails to publish, you can note the error, and schedule a job to attempt it again in the future if you would like.

So a couple things:

  1. You're calling after_save which means that if you call update_attributes, it's going to try to publish again. You'll get an infinite loop of this publishing attempt basically. Probably not exactly what you want. This is the primary issue with callbacks.

  2. What's the error message that you're receiving? It looks like you save this to the database, so I'm curious what's causing it to trip up.

I'm going to be doing some testing on Heroku to see, but I think you'll be fine using Puma on there still.

I forgot about that until after I finished recording! The actioncable-examples repository that I cloned still used the Redis adapter default, so I totally overlooked that change. Great to know.

Awesome, didn't realize they started offering that. This is going to help a lot with Twitter integrations. Thanks for sharing!

Posted in Rich text format editor in rails 4

The ghost editor looks pretty sweet too! Thanks for sharing that.

Posted in How to use devise with Adminitrate?

That definitely looks right. Huh. I'm not sure what is causing that.

One thing you could try is removing the Admin class and using AdminUser as the name instead to see if that does the trick.

Posted in How do I build conditional form fields?

For most of these, I've found that the easiest way (for me at least) is often to write some custom JS to handle it. Basically when the first thing is selected, use an AJAX request to load up some JSON for the desired subcategories and then use those to update the options available in the form. Something like this:

I'll have do an episode on this soon, because this is a really common thing to do, but not well documented.

Posted in Sharing on social network

I've been pretty happy using #3 because it doesn't slow down the page load at all, and you can still customize those pretty well. The downside is you can't include the count of shares because that requires JS.

If you do need those extras from the JS, you could use a service to simplify, or a relatively easy way is just to include the JS libraries using the official instructions. I've found that using services like AddThis are really just a pain to use. Same thing goes for gems, it's just adding an unnecessary layer of abstraction to it that you don't really need.

I just updated my open graph tags tonight and did the following in the head in the layout.

<meta name="twitter:card" content="summary" />
<meta name="twitter:site" content="@gorails" />
<meta name="twitter:title" content="<%= yield :title %>" />
<meta name="twitter:description" content="<%= yield :meta_description %>" />
<meta name="twitter:image" content="<%= asset_url "open-graph.jpg" %>" />
<meta name="twitter:creator" content="@excid3" />

That way the views can have the following code to put in the yield sections.

<%= content_for :title, %>

You can then wrap the head code with the following to include it or not based upon existence of the content:

<% if content_for?(:title) %>
<% end %>

I believe there's a "converters" option that you can pass in. It basically tries to convert every column to a Date object and if it is successful, it will use that. You'd pass in the ":date" option for it (something like converters: [:date] I believe). You can read a bit more about that here:

Plus if you have something custom that doesn't work with that, you can write your own converter. I just did this for a project and figured I should make an episode on it. Pretty nifty and easy to do, but really poorly documented.

Posted in Admin Interfaces with Administrate Discussion

Ah that's disappointing. I wonder what the issue was with the JS...As long as you've got an easy admin to work with, that's all that matters.

Posted in Deploying To Production on Heroku with Puma Discussion

Great question Jeff. I think Mongoid's docs do a pretty good job outlining the difference between it and ActiveRecord here:

Posted in Rails Console

What Andrew said! For some of the controller methods, you can sometimes just instantiate the class like any other normal object. The trouble will be that you don't have request objects to work with to pass in.

That's a really good idea! I'll do that. :)

Computers eh? :)

logo Created with Sketch.

Ruby on Rails tutorials, guides, and screencasts for web developers learning Ruby, Rails, Javascript, Turbolinks, Stimulus.js, Vue.js, and more. Icons by Icons8

© 2020 GoRails, LLC. All rights reserved.