Miscellaneous ways to improve your Rails experience =================================================== --- date: "2014-05-08" --- Recently, I've been working on [a Rails web application][leaguer], that's really the baby of a friend of mine. Anyway, through its development, I've come up with a couple things that should make your interactions with Rails more pleasant. ## Auto-(re)load classes from other directories than `app/` The development server automatically loads and reloads files from the `app/` directory, which is extremely nice. However, most web applications are going to involve modules that aren't in that directory; and editing those files requires re-starting the server for the changes to take effect. Adding the following lines to your [`config/application.rb`][application.rb] will allow it to automatically load and reload files from the `lib/` directory. You can of course change this to whichever directory/ies you like. module YourApp class Application < Rails::Application … config.autoload_paths += ["#{Rails.root}/lib"] config.watchable_dirs["#{Rails.root}/lib"] = [:rb] … end end ## Have `submit_tag` generate a button instead of an input In HTML, the `<input type="submit">` tag styles slightly differently than other inputs or buttons. It is impossible to precisely controll the hight via CSS, which makes designing forms a pain. This is particularly noticable if you use Bootstrap 3, and put it next to another button; the submit button will be slightly shorter vertically. The obvious fix here is to use `<button type="submit">` instead. The following code will modify the default Rails form helpers to generate a button tag instead of an input tag. Just stick the code in [`config/initializers/form_improvements.rb`][form_improvements.rb]; it will override `ActionView::Hlepers::FormTagHelper#submit_tag`. It is mostly the standard definition of the function, except for the last line, which has changed. # -*- ruby-indent-level: 2; indent-tabs-mode: nil -*- module ActionView module Helpers module FormTagHelper # This is modified from actionpack-4.0.2/lib/action_view/helpers/form_tag_helper.rb#submit_tag def submit_tag(value = "Save changes", options = {}) options = options.stringify_keys if disable_with = options.delete("disable_with") message = ":disable_with option is deprecated and will be removed from Rails 4.1. " \ "Use 'data: { disable_with: \'Text\' }' instead." ActiveSupport::Deprecation.warn message options["data-disable-with"] = disable_with end if confirm = options.delete("confirm") message = ":confirm option is deprecated and will be removed from Rails 4.1. " \ "Use 'data: { confirm: \'Text\' }' instead'." ActiveSupport::Deprecation.warn message options["data-confirm"] = confirm end content_tag(:button, value, { "type" => "submit", "name" => "commit", "value" => value }.update(options)) end end end end I'll probably update this page as I tweak other things I don't like. [leaguer]: https://github.com/LukeShu/leaguer [application.rb]: https://github.com/LukeShu/leaguer/blob/c846cd71411ec3373a5229cacafe0df6b3673543/config/application.rb#L15 [form_improvements.rb]: https://github.com/LukeShu/leaguer/blob/521eae01be1ca3f69b47b3170a0548c3268f4a22/config/initializers/form_improvements.rb