“...I've been working since 2008 with Ruby / Ruby on Rails, love a bit of Elixir / Phoenix and learning Rust.
I also poke through other people's code and make PRs for OpenSource Ruby projects that sometimes make it
Currently working for GenieBelt who are based in Copenhagen, Denmark ...”
Suppose I want to overwrite a method an apply a optional argument that the original method didn’t accept.
class Something < ActiveRecord::Base
def to_s(or_other = nil)
if or_other
Other.new.to_s
else
super
end
end
end
Seems fine. However, when you call to_s you’d get an error like wrong number of arguments (1 for 0). The reason is because without supply arguments to super they, by default, use the arguments passed to the overridden method. Since the original method didn’t accept any arguments previously then this fails. In order to avoid this you must call super() to deliberatly call it without arguments.
class Something < ActiveRecord::Base
def to_s(or_other = nil)
if or_other
Other.new.to_s
else
super()
end
end
end
Just wanted to test out OmniAuth by plugging into PledgeMusic authentication.
github. braindeaf/omniauth-pledgemusic
Well it works and you get an access token out, nice and simple. Wouldn’t mind re-styling the OmniAuth::Form to be a bit more in keeping with the decor.
After finding the GitHub jQuery Repo Widget I want to embed the widget in my blog posts. The body of which uses RedCloth So I needed to add a custom tag which could turn.
You can extend RedCloth’s HTML formatter by placing something like this in config/initializer/redcloth_extensions.rb for example.
require 'redcloth'
module RedCloth
module Extensions
def github(options)
html = %Q{<div class="github-widget" data-repo="#{options[:text]}"></div>\n}
end
end
end
RedCloth::Formatters::HTML.send(:include, RedCloth::Extensions)
In a recent project I wanted to use a date to be a component of a hashed string in order to create a unique hash for a password reset page. I want the hash to expire when the user’s password is reset, in this case when the user’s last_logged_in datetime changes. I can generate the hash simply.
class User < ActiveRecord::Base
....
def password_token
unless new_record?
Digest::SHA1.hexdigest([id, password_hash, salt, last_logged_in.to_i].join)
end
end
....
end
I don’t want to store this hash in the database (we might want to in the future to optimise the look up). So I need to generate the hash in SQL, but how to I do the equivalent to Time#to_i in SQL.
class User < ActiveRecord::Base
....
class << self
....
def with_password_token(password_token)
where("SHA1(CONCAT(users.id, IF(users.password_hash IS NOT NULL, users.password_hash,''), IF(users.salt IS NOT NULL, users.salt, ''), IF(users.last_logged_in, UNIX_TIMESTAMP(users.last_logged_in), ''))) = ?", password_token).first
end
....
end
....
end
Had another annoying issue with posts on this blog not appearing immediately after being published.
class Post < ActiveRecord::Base
scope :published, where(['published_at IS NOT NULL AND published_at < ?', Time.now])
end
</pre></code>
So any Post with a published_at in the past should be found in Post.published.all for example. The post is missing. I thought this was an issue in *production* so I enabled logging and redeployed.
<pre><code>
Robl::Application.configure do
.....
# Set to :debug to see everything in the log.
# config.log_level = :info
config.log_level = :debug
.....
Looking at the log it seems fine initially, but then I realise that the timestamp for the published_at date is the same ‘2014-09-29 09:40:59’ seconds after the the page is reloaded.
D, [2014-10-02T21:51:22.979289 #4499] DEBUG -- : (0.3ms) SELECT COUNT(*) FROM `posts` WHERE (published_at IS NOT NULL AND published_at < '2014-09-29 09:40:59')
D, [2014-10-02T21:52:56.305813 #4499] DEBUG -- : Post Load (0.2ms) SELECT `posts`.* FROM `posts` WHERE (published_at IS NOT NULL AND published_at < '2014-09-29 09:40:59') ORDER BY published_at DESC LIMIT 25 OFFSET 0
...
D, [2014-10-02T21:52:56.384903 #4499] DEBUG -- : (0.2ms) SELECT COUNT(*) FROM `posts` WHERE (published_at IS NOT NULL AND published_at < '2014-09-29 09:40:59')
...
Since Time.now is apparently standing still a bug in the model scope definition is incorrect. The where doesn’t evaluate Time.now every time the scope is called it evaluates it when the class is loaded. The ActiveRecord Query needs to be placed inside a lambda in order that its contents are evaluated when the scope is called.
class Post < ActiveRecord::Base
scope :published, -> { where(['published_at IS NOT NULL AND published_at < ?', Time.now]) }
end
Ran into a problem where by the name of the field in our database doesn’t properly reflect the human name of the attribute.
e.g. User#some_id
[12] pry(main)> User.human_attribute_name :some_id
=> "Some"
[13] pry(main)> user = User.new
=> #<User id: nil, some_id: nil>
[14] pry(main)> user.errors.full_messages
=> ["Some should be valid"]
So ‘Some’ is a bit meaningless. But we can change this in the i18n config files like so.
en:
activerecord:
attributes:
user:
some_id: Something much more awesome
</pre></code>
And then you get this....
<pre><code>
[17] pry(main)> User.human_attribute_name :some_id
=> "Something much more awesome"
[18] pry(main)> user = User.new
=> #<User id: nil, some_id: nil>
[10] pry(main)> user.errors.full_messages
=> ["Something much more awesome should be valid"]
The recently reported Bash vulnerability Shellshock should be tackled as soon as possible on all Unix based systems. For me it was my personal server, client servers, desktops, laptops and all servers in our production cluster. That’s a lot of servers.
env x='() { :;}; echo vulnerable' bash -c 'echo this is a test'
If you’re vulnerable you’ll see
vulnerable
this is a test
If you’re all good you’ll see
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
this is a test
If you’re vulnerable take steps to upgrade bash as soon as possible.
Needed to tweak the time format from the default “Sat, 27 Sep 2014 17:32:10 +0000” to “September 27, 2014 at 17:32”. You can do this in config/locales/en.yml like so
Ran into a really irritating issue this week. While trying to test a new install of Resque . Attempting to run a worker kept return a ‘subclass mismatch error’ on some classes in our Rails application. Our Blah::User class was seemingly being reloaded and on the second reload the anonymous parent class had a mismatch. Make sense.
module Blah
class User < Struct.new(:id, :email)
def to_s
"#{id} #{email}"
end
end
end
According to this Reddit post you shouldn’t subclass structs. Taking another look at this the above seems incorrect, I never noticed it before but the above would create a new anonymous Struct class and would immediately subclass it. The anonymous class on it’s own is not required, and it appears is the cause of this class loading oddness. The problem is resolved when we define the Struct without subclassing and we haven’t got any anonymous Struct classes using up memory.
module Blah
User = Struct.new(:id, :email) do
def to_s
"#{id} #{email}"
end
end
end