summaryrefslogtreecommitdiff
path: root/public/rails-improvements.md
blob: c87c093dcdb1a8f20ee177a9928e2475c5c34fc8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
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