summaryrefslogtreecommitdiff
path: root/public/rails-improvements.html
blob: 2b7f52747ebc25421b61d1fad2095091302464f5 (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
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Miscellaneous ways to improve your Rails experience — Luke Shumaker</title>
  <link rel="stylesheet" href="assets/style.css">
  <link rel="alternate" type="application/atom+xml" href="./index.atom" name="web log entries"/>
</head>
<body>
<header><a href="/">Luke Shumaker</a> » <a href=/blog>blog</a> » rails-improvements</header>
<article>
<h1 id="miscellaneous-ways-to-improve-your-rails-experience">Miscellaneous ways to improve your Rails experience</h1>
<p>Recently, I’ve been working on <a href="https://github.com/LukeShu/leaguer">a Rails web application</a>, 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.</p>
<h2 id="auto-reload-classes-from-other-directories-than-app">Auto-(re)load classes from other directories than <code>app/</code></h2>
<p>The development server automatically loads and reloads files from the <code>app/</code> 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.</p>
<p>Adding the following lines to your <a href="https://github.com/LukeShu/leaguer/blob/c846cd71411ec3373a5229cacafe0df6b3673543/config/application.rb#L15"><code>config/application.rb</code></a> will allow it to automatically load and reload files from the <code>lib/</code> directory. You can of course change this to whichever directory/ies you like.</p>
<pre><code>module YourApp
    class Application &lt; Rails::Application
        …
        config.autoload_paths += [&quot;#{Rails.root}/lib&quot;]
        config.watchable_dirs[&quot;#{Rails.root}/lib&quot;] = [:rb]
        …
    end
end</code></pre>
<h2 id="have-submit_tag-generate-a-button-instead-of-an-input">Have <code>submit_tag</code> generate a button instead of an input</h2>
<p>In HTML, the <code>&lt;input type=&quot;submit&quot;&gt;</code> 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.</p>
<p>The obvious fix here is to use <code>&lt;button type=&quot;submit&quot;&gt;</code> 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 <a href="https://github.com/LukeShu/leaguer/blob/521eae01be1ca3f69b47b3170a0548c3268f4a22/config/initializers/form_improvements.rb"><code>config/initializers/form_improvements.rb</code></a>; it will override <code>ActionView::Hlepers::FormTagHelper#submit_tag</code>. It is mostly the standard definition of the function, except for the last line, which has changed.</p>
<pre><code># -*- 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 = &quot;Save changes&quot;, options = {})
        options = options.stringify_keys

        if disable_with = options.delete(&quot;disable_with&quot;)
          message = &quot;:disable_with option is deprecated and will be removed from Rails 4.1. &quot; \
                    &quot;Use &#39;data: { disable_with: \&#39;Text\&#39; }&#39; instead.&quot;
          ActiveSupport::Deprecation.warn message

          options[&quot;data-disable-with&quot;] = disable_with
        end

        if confirm = options.delete(&quot;confirm&quot;)
          message = &quot;:confirm option is deprecated and will be removed from Rails 4.1. &quot; \
                    &quot;Use &#39;data: { confirm: \&#39;Text\&#39; }&#39; instead&#39;.&quot;
          ActiveSupport::Deprecation.warn message

          options[&quot;data-confirm&quot;] = confirm
        end

        content_tag(:button, value, { &quot;type&quot; =&gt; &quot;submit&quot;, &quot;name&quot; =&gt; &quot;commit&quot;, &quot;value&quot; =&gt; value }.update(options))
      end

    end
  end
end</code></pre>
<p>I’ll probably update this page as I tweak other things I don’t like.</p>

</article>
<footer>
<p>The content of this page is Copyright © 2014 <a href="mailto:lukeshu@sbcglobal.net">Luke Shumaker</a>.</p>
<p>This page is licensed under the <a href="https://creativecommons.org/licenses/by-sa/3.0/">CC BY-SA-3.0</a> license.</p>
</footer>
</body>
</html>