5 Kesalahan kecil programming dengan Rails yang dapat mengganggu aplikasimu!

1. Halt Callback Chain when false is returned
Sebelum Rails versi 5, semua fungsi yang mengembalikan nilai falsedi dalam before_ yang dipanggil pada Callback di ActiveModel atauActiveModel::Validations , ActiveRecord dan ActiveSupport akan menampilkan pesan errorActiveRecord::RecordNotSaved karena false menghentikan proses manipulasi.
# app/models/card.rb
class Card < ActiveRecord::Base
before_save :set_upcase_for_full_name
def set_upcase_for_full_name
self.full_name = self.full_name.upcase
self.active ||= false
end
end# console
Card.create(full_name: "Gilang Putera Mahardhika")
=> ActiveRecord::RecordNotSaved: ActiveRecord::RecordNotSaved
Untuk rails versi 5, sudah tidak mengalami isu ini dengan menambah initializer callback_terminator.rb , secara default Rails return false. Artinya behaviour untuk menghentikan callback chain saat fungsi didalam befoer_ mengembalikan nilai menjadi false dimatikan.
ActiveSupport.halt_callback_chains_on_return_false = falseSehingga hasilnya adalah jika di eksekusi menggunakan Rails 5 menjadi :
# app/models/card.rb
class Card < ApplicationRecord
before_save :set_upcase_for_full_name
def set_upcase_for_full_name
self.full_name = self.full_name.upcase
self.active ||= false
end
end
Card.create(full_name: "Gilang Putera Mahardhika")
=> #<Card id: 1, full_name: "GILANG PUTERA MAHARDHIKA", active: false, created_at: "2018-09-07 13:18:42", updated_at: "2018-09-07 13:18:42">2. Menuliskan credentials di dalam Code
Rails 5.2 sudah memiliki tambahan fitur untuk mengamankan credentials, selengkapnya lihat dokumentasi Rails Credentials . Akan tetapi versi sebelumnya perlu mengelola credentials menggunakan ENV environment variable. Kesalahan yang biasa dilakukan adalah menulis credentials langsung di dalam codebase.
class Application < Rails::Application
config.action_mailer.delivery_method = :mailgun
config.action_mailer.mailgun_settings = {
api_key: "API_KEY_12345",
domain: "domain.mailgun.com"
}
endPada versi sebelum Rails 5 bisa menggunakan alternatif gem dotenv-rails dengan membuat config .env.production , .env.development untuk mengisi
# config/application.rb
class Application < Rails::Application
config.action_mailer.delivery_method = :mailgun
config.action_mailer.mailgun_settings = {
api_key: ENV["MAILGUN_API_KEY"],
domain: ENV["MAILGUN_DOMAIN"]
}
endPada file .env.production
MAILGUN_API_KEY="API_KEY_12345"
MAILGUN_DOMAIN="domain.mailgun.com"3. Lupa Setting default url action_mailer
Lupa konfigurasi host di environment menyebabkan error missing host to link_to, mengakibatkan tidak bisa menampilkan full url apabila di view email ada url_path helper.
Tambahkan konfigurasi default url untuk mailer
# config/environment/production.rb
config.action_mailer.default_url_options = { host: "blog.ku" }4. Staging Server terindex Google


Server staging seharusnya digunakan untuk kepentingan internal saja, pastikan robot.txt disallow dari web spider.
# staging server
# robot.txt
User-Agent: *
Disallow: /Atau buatlah akses ke server staging menggunakan basic_auth .
authenticate_or_request_with_http_basic("Staging") do |name, pass|
name == "staging" && pass == "staging"
end5. SQL Injection
Rails memberikan kemudahan untuk melakukan query ke database dengan ORM ActiveRecord. Pastikan kode Anda tidak membuat kesalahan dengan memberi ruang untuk SQL Injection.
Company.where("upper(name) like '%#{params[:q]}%'")Kode di atas memberikan celah untuk dapat diserang dengan SQL Injection. Solusinya adalah dengan memberikan argumen maupunn placeholder binding.
Company.where("name like ? ", "%#{params[:q]}%")
Company.where("name like :query", { query: "%#{params[:q]}%" })Demikian Kesalahan kecil namun “mematikan”! Keep your codebase healthy! Happy Coding!
