- App
- Authentification
- Attachments
- Storage
- Eviter l’injection javascript
- Export Excel
- Mails transactionnels
- Envoi de SMS
- Syntaxe
- Rangement des modèles
- Autoscale
- Sourcemap JS publiés automatiquement sur Bugsnag
- Requête AJAX avec paramètre GET
- Requêtes SQL avec clause LIKE
- Infrastructure
- Sources et références
- Notes pour plus tard
App
rails 5.2
Authentification
devise
Attachments
activestorage
Storage
AWS-SDK (v2)
Eviter l’injection javascript
def sanitize_fields
full_sanitizer = Rails::Html::FullSanitizer.new
white_list = Rails::Html::WhiteListSanitizer.new
# Only text allowed
self.email = full_sanitizer.sanitize(self.email)
self.name = full_sanitizer.sanitize(self.name)
self.firstname = full_sanitizer.sanitize(self.firstname)
self.gender = full_sanitizer.sanitize(self.gender)
self.mobile = full_sanitizer.sanitize(self.mobile)
self.pos = full_sanitizer.sanitize(self.pos)
self.address = full_sanitizer.sanitize(self.address)
self.zipcode = full_sanitizer.sanitize(self.zipcode)
self.city = full_sanitizer.sanitize(self.city)
end
Export Excel
/config/initializers/mime_types.rb
Mime::Type.register "application/xls", :xls
Rien de spécial dans les routes
Pour lier dans une vue
<%= link_to 'Sponsorings', admin_sponsorings_path(format: :xls) %>
/controllers/admin/users_controller.rb
class Admin::UsersController < Admin::ApplicationController
respond_to do |format|
format.xls { @sponsorings = Sponsoring.export_for_country @filter_country }
end
end
/views/admin/users/sponsorings.xls.erb
<?xml version="1.0"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40">
<Worksheet ss:Name="Sheet1">
<Table>
<Row>
<% keys = @sponsorings.try(:first).try(:keys) || [] %>
<% keys.each do |name| %>
<Cell><Data ss:Type="String"><%= name %></Data></Cell>
<% end %>
</Row>
<% @sponsorings.each do |sponsoring| %>
<Row>
<% sponsoring.values.each do |value| %>
<Cell><Data ss:Type="String"><%= value %></Data></Cell>
<% end %>
</Row>
<% end %>
</Table>
</Worksheet>
</Workbook>
Mails transactionnels
Addon Sendgrid in Heroku
https://devcenter.heroku.com/articles/sendgrid#ruby
Amazon SES
Attention, pour utiliser Amazon SES il faut une clé d’accès à un format spécial, on ne peut pas juste donner des droits sur SES à un compte standard. Donc on crée un compte depuis Amazon SES (smtp settings / create smtp credentials) et après si on veut on utilise ce même compte pour lequel on génère une 2e clé d’accès pour accéder aux autres services.
Envoi de SMS
ou Amazon Simple Notification Service
Syntaxe
Pas de <%-
, c’est idem à <%
Rangement des modèles
Dans les fichiers de modèle l’ordre à respecter est : concerns / accessors / relations / activestorage / nested / enum / validations / callbacks / scopes / helpers
Soit :
class Foo < ApplicationRecord
include Excerptable
has_many :bars
has_one_attached_deletable :illustration
accepts_nested_attributes_for :bars, allow_destroy: true
enum kind: { choice1: 1, choice2: 2 }
validates :title, :text, presence: true
after_save :do_something
scope :ordered, -> { order(date) }
excerpt_with :description
Autoscale
Utiliser Rails Autoscale https://elements.heroku.com/addons/rails-autoscale
Adept scale est moins pertinent, parce qu’il suffit d’une requête longue en admin pour provoquer un upscale.
Sourcemap JS publiés automatiquement sur Bugsnag
- Ajouter au app/assets/config/manifest.js la génération des fichiers map
//= link_directory ../javascripts .js //= link_directory ../javascripts .js.map
- Créer une tâche rake lib/tasks/source_map.rake (Ce code est à adapter…)
namespace :source_map do
task send_to_bugsnag: :environment do
return if Rails.env.development? # nothing to do on development
url = 'https://upload.bugsnag.com'
bugsnag_javascript_api_key = ENV['BUGSNAG_JAVASCRIPT_KEY']
domain = XXX
['application', 'admin', 'superadmin'].each do |file_name|
source_map = Rails.application.assets_manifest.assets["#{file_name}.js.map"]
minified_file = Rails.application.assets_manifest.assets["#{file_name}.js"]
puts "send #{file_name} - start"
params = {
'apiKey' => bugsnag_javascript_api_key,
'overwrite' => true,
'minifiedUrl' => "https://#{domain}/assets/#{minified_file}",
'sourceMap' => File.new("public/assets/#{source_map}", 'rb')
}
RestClient.post url, params
puts "send #{file_name} - end"
end
end
end
- Dans le Procfile ajouter l’exécution de la tâche rake au déploiement.
release: rails db:migrate && rake source_map:send_to_bugsnag
Requête AJAX avec paramètre GET
Lorsqu’on effectue une requête AJAX avec un paramètre en GET concaténé, il faut ABSOLUMENT l’encoder pour éviter les bad requests.
var url = '/search?term=' + encodeURI($scope.term);
Requêtes SQL avec clause LIKE
Lorsqu’on fait une requête SQL avec une clause LIKE (pour de la recherche par exemple), il faut que le pattern utilisé soit sanitized pour éviter que les symboles _
& %
soient interprétés.
Une méthode est offerte par ActiveRecord, voici un exemple avec un scope search
pour faire de la recherche à partir d’un argument term
:
class Foo < ApplicationRecord
scope :search, -> (term) {
where(
"unaccent(#{table_name}.search) ILIKE unaccent(?)",
"%#{sanitize_sql_like(term.downcase)}%"
)
}
end
Infrastructure
Gemfile
# Infrastructure
gem 'puma' # Server
gem 'pg', '0.21.0' # Database
gem 'bugsnag' # Exception catching
gem 'redis-rails' # Cache db
gem 'newrelic_rpm' # Apdex
Redis
Policy should be allkeys-lru (https://devcenter.heroku.com/articles/heroku-redis#maxmemory-policy)
heroku redis:maxmemory --policy allkeys-lru
Sources et références
- https://github.com/bbatsov/ruby-style-guide
- https://github.com/thoughtbot/guides
- https://fortrabbit.github.io/quotes/
Notes pour plus tard
Wordpress, Test de Joel, Tests automatisés, Github, Code climate, Bugsnag, New relic