environ 3 minutes de lecture

Back

En gros, dès qu'on a une base de données, c'est du dev back...

Scroll

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

Twilio

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

  1. Ajouter au app/assets/config/manifest.js la génération des fichiers map
    //= link_directory ../javascripts .js
    //= link_directory ../javascripts .js.map
    
  2. 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
  1. 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