Faire en sorte que Rails recherche les fichiers .mobile dans le sous-répertoire ?
-
20-12-2019 - |
Question
J'utilise le mobile fu gem pour effectuer une détection d'agent utilisateur, afin de pouvoir servir des modèles d'extension .html ou .mobile en fonction du client,
Maintenant, cette partie fonctionne très bien, mais je n'aime pas que les dossiers de vue soient un peu encombrés avec deux fois plus de fichiers, c'est-à-dire.
app/views/profiles/show.mobile.haml
app/views/profiles/show.html.haml
app/views/profiles/edit.mobile.haml
app/views/profiles/edit.html.haml
etc
ce que j'aimerais avoir à la place c'est :
app/views/profiles/html/show.html.haml
app/views/profiles/html/edit.html.haml
Et
app/views/profiles/mobile/show.mobile.haml
app/views/profiles/mobile/edit.mobile.haml
Et demandez à Rails de rechercher automatiquement le bon dossier/répertoire pour les fichiers en fonction de la demande.Est-ce possible?
C'est peut-être quelque chose de vraiment facile à faire, faites-moi savoir si c'est un comportement qui sort des sentiers battus.
Merci
La solution
Rails 4.1 possède une nouvelle fonctionnalité intégrée appelée Variantes de l'ActionPack, qui détecte l'agent utilisateur (comme le mobile fu gem).
En gros, vous pouvez ajouter ceci par exemple dans votre ApplicationController :
before_action :detect_device_format
private
def detect_device_format
case request.user_agent
when /iPad/i
request.variant = :tablet
when /iPhone/i
request.variant = :phone
when /Android/i && /mobile/i
request.variant = :phone
when /Android/i
request.variant = :tablet
when /Windows Phone/i
request.variant = :phone
end
end
Disons que vous disposez d'un ProfilesController.Maintenant, vous pouvez faire ceci :
class ProfilesController < ApplicationController
def index
respond_to do |format|
format.html # /app/views/profiles/index.html.erb
format.html.phone # /app/views/profiles/index.html+phone.erb
format.html.tablet # /app/views/profiles/index.html+tablet.erb
end
end
end
Revenons à votre question :Si vous souhaitez rechercher des fichiers dans un autre dossier/répertoire, vous pouvez procéder comme suit :
format.html.phone { render 'mobile/index' } # /app/views/mobile/index.html+phone.erb
Il y a aussi bon tuto qui montre comment l'utiliser.