grosser/rspec-instafail
Show failing specs instantly. Show passing spec as green dots as usual.
Configuration:
# spec/spec.opts (.rspec for rspec 2)
--require rspec/instafail
--format RSpec::Instafail
CSS: Emulate linear gradients with inset box shadows
Why is this useful?
- You can have a background image on the same element, overlaying it with a transparent gradient.
- Since you are probably using gradients to give an element a glossy or three-dimensional feel, box shadows work much better for this. This is because linear gradients always stretch to the full size of the element (which can grow with user input), while a natural shine or shadow only highlights a fixed size on the top or bottom.
- Browser support for linear gradients is a mess. I avoid using them. In part...
CSS: Emulate borders with inset box shadows
When is this useful?
- When both parent and child elements have borders, with this technique you don't get two borders (which looks ugly). This is because child elements are rendered over inset box shadows, not inside inset box shadows.
- You want more than one border on the same element. You can have as many inset box shadows on the same element as you like, e.g. allowing you to make a picture-frame-like border.
Examples
Remember the attribute list of box-shadow
is x-offset, y-offset, blur radius, shadow r...
Automatically strip all string fields of an ActiveRecord
If your application has forms to edit string fields, you probably want to strip the entered values (remove whitespace from beginning and end). The reason is that your users will copy + paste values from unholy places (websites, Microsoft Office) and end up having trailing whitespace in most of their records.
Because browsers ignore whitespace, no one will usually notice this until you get the weirdest bug reports (e.g. two seemingly equal records are not, or multiple records for "unique" values).
Use the attached trait in your model to hav...
floere/phony
The (admittedly crazy) goal of this Gem is to be able to format/split all phone numbers in the world.
7 Ways to Decompose Fat ActiveRecord Models - Code Climate Blog
“Fat models” cause maintenance issues in large apps. Only incrementally better than cluttering controllers with domain logic, they usually represent a failure to apply the Single Responsibility Principle (SRP). “Anything related to what a user does” is not a single responsibility.
Early on, SRP is easier to apply. ActiveRecord classes handle persistence, associations and not much else. But bit-by-bit, they grow. Objects that are inherently responsible for persistence become the de facto owner of all business logic as well. And a year or tw...
RSpec: Change the type of a spec regardless of the folder it lives in
In a Rails application, *_spec.rb
files get special treatment depending on the file's directory. E.g. when you put a spec in spec/controllers
your examples will have some magic context like controller
, post
or get
that appears out of nowhere.
If you want that magic context for a spec in another folder, use the :type
option:
describe CakesController, :type => :controller do
...
end
jsTimezoneDetect
Makes a robust determination of a user's timezone through Javascript.
mattheworiordan/capybara-screenshot
Takes a screenshot when you call it, or when a test fails.
Fixing errors with state_machine when excluding states
This is for you if you get the following strange error from the state_machine
gem:
undefined method `-' for #<StateMachine::BlacklistMatcher:0x124769b0>
You probably did something like this in your state_machine ... do
block:
def self.final_states
[ :foo, :bar ]
end
transition (all - machine.final_states - [:baz]) => :target_state
Instead, define the source states like this:
def self.final_states
[ :foo, :bar ]
end
transition (all - (mach...
rails/turbolinks
Turbolinks makes following links in your web application faster. Instead of letting the browser recompile the JavaScript and CSS between each page change, it keeps the current page instance alive and replaces only the body and the title in the head.
This is similar to pjax, but instead of worrying about what element on the page to replace, and tailoring the server-side response to fit, we replace the entire body. This means that you get the bulk of the speed benefits from pjax (no recompiling of the JavaScript or CSS) without having to tail...
Literally 101 Ruby tricks
The linked slidedeck holds many tips, of which I list the most interesting to me below
DATA and END
The __END__
keyword tells Ruby where a file ends – but you don't have to stop there. Any text you add after it is accessible via the DATA
object.
Running the attached example file data.rb
prints:
DATA is a File object to everything in the current file after "__END__"
No braces needed for 'special variables'
@instance, @@class, $global = [ 'instance', 'class', 'global' ]
puts "#@instance, #@@class, #$global"
...
How Ruby lets you keep script and data in *one* file
The __END__
keyword tells Ruby where a file ends – but you don't have to stop there. Any text you add after it is accessible via the DATA
object.
The attached example file data.rb
looks like this:
puts DATA.read
__END__
DATA is a File object to everything in the current file after "__END__"
Running it with ruby data.rb
prints:
DATA is a File object to everything in the current file after "__END__"
Creating a Grid for Product View for a eCommerce Site
Randy Hoyt is presenting a way to display something (e.g. products) in a grid. It's responsive, too!
Rspec_spinner or cucumber_spinner get into an infinite loop
Chances are, something in your project uses the mathn
library, which is known to cause infinite loops when rendering the progress bar. If so, this will probably fix it.
Workaround for broken integer division after requiring the mathn library
Ruby's mathn library changes Fixnum
division to work with exact Rational
s, so
2 / 3 => 0
2 / 3 * 3 => 0
require 'mathn'
2 / 3 => Rational(2,3)
2 / 3 * 3 => 2
While this might sometimes be quite neat, it's a nightmare if this gets required by some gem that suddenly redefines integer division across your whole project. Known culprits are the otherwise excellent distribution and [GetText](https://g...
An easy demonstration of what Twitter Bootstrap does
Holly Schinsky from Adobe shows some of Bootstrap's capabilities. The combination of explanation, screenshots and source code makes it easy to understand
A jQuery plugin pattern every jQuery plugin should use
Many jQuery plugins suffer from a good plugin architecture. When you write jQuery plugins you should use the plugin pattern described in this article which makes your plugin highly customizable and extensible.
Related article with patterns for namespaced jquery plugins (more detailed)
Get rid of WARNING: Nokogiri was built against LibXML version 2.7.7, but has dynamically loaded 2.7.8
If you get this warning on your local machine one of these steps might help:
Rebuilt the gem with the newer library
gem install --no-rdoc --no-ri nokogiri -- --with-xml2-include=/opt/local/include/libxml2 --with-xml2-lib=/opt/local/lib
If you still get the error, try to uninstall all nokogiri versions with
gem uninstall nokogiri
and install nokogiri again.
Fixing the issue on servers
However, on our servers this probably will not work. On the server, gems are stored in the ../shared/bundle/ruby/:version/gems
dire...
Howto transfer a single mysql table between several deployment stages
Example task: Multiply the table holidays
between several stages.
-
Open two terminals:
shell-for stage_1 shell-for stage_2
-
Get the stage1 and stage2 MySQL credentials:
cat /opt/www/the_stage.host.tld/current/config/database.yml cat config/database.yml # should do it
-
Dump the table to a path reachable by the stage2 user (e.g. home):
mysqldump -h mysql1 -u stage_1_user -p stage_1_database table_name > ~/table_name_dump.mysql # Select certain records using --where "some_id > 666"
(-...
Asset pipeline may break Javascript for IE (but only on production)
If some of your JavaScripts fail on Internet Explorer, but only in staging or production environments, chances are that JavaScript compression is the culprit.
By default, Rails 3.2 compresses JavaScript with UglifyJS. I have seen a few cases where this actually breaks functioning JavaScript on IE (one example is the CKEditor).
I fixed this by switching to Yahoo's YUI Compressor.
To do this, do the following:
- replace the
uglifier
gem with theyui-compressor
gem...
Cucumber step to interact with an iframe using Capybara webdriver
Give your iframe
a name attribute (i.e. <iframe name="myframe">
) and then simply use
When I press "Foo" in the iframe "myframe"
Then I should see "Bar!" in the iframe "myframe"
Step as follows:
Then /^(.*) in the iframe "([^\"]+)"$/ do |step, iframe_name|
browser = page.driver.browser
browser.switch_to.frame(iframe_name)
step(step)
browser.switch_to.default_content
end
Machinist blueprints do not work with a column :display
This didn't work for me. Seems display
is already taken in Machinist
.
# in spec/support/blueprints.rb
Partner.blueprint do
company_name
display { true }
end
Unsaved record disappears when assigning to an association
If this happens to you:
user.avatar = Avatar.new
user.avatar # => nil
(where avatar
is a belongs_to
), you probably declared your association incorrectly.
Always do
class User < ActiveRecord::Base
belongs_to :avatar
end
and never
class User < ActiveRecord::Base
belongs_to 'avatar'
end