Je n'ai trouvé aucun document ni exemple sur la façon de structurer mon application pour permettre à différentes vues dans le même contrôleur d'utiliser des mises en page et des feuilles de style complètement différentes.
Notre application a été échafaudée et nous avons ensuite utilisé des générateurs astucieux pour générer des vues, puis ajouté un dispositif d'authentification. Nous avons des vues et des contrôleurs pour deux modèles: les widgets et les entreprises.
J'ai actuellement une seule mise en page: layouts/application.html.haml, je ne vois pas cela référencé nulle part donc je suppose (a Rails newbie) qu'il est toujours utilisé par la convention de nommage.
Je dois maintenant ajouter quelques vues (pour les navigateurs mobiles) qui ont une feuille de style et une disposition différentes (par exemple, aucun lien de connexion/déconnexion en haut à droite), au sein des mêmes contrôleurs.
Comment cela peut-il être fait?
Par défaut, layouts/application.html.haml
(.erb
si vous n'utilisez pas haml).
En fait, le fichier de mise en page peut être défini par contrôleur ou par action, au lieu de par vue, par dossier de vue.
Il y a peu de cas:
another.html.haml
au lieu de application.html.haml
)class ApplicationController < ActionController::Base
layout "another"
# another way
layout :another_by_method
private
def another_by_method
if current_user.nil?
"normal_layout"
else
"member_layout"
end
end
end
class SessionsController < ActionController::Base
layout "sessions_layout"
# similar to the case in application controller, you could assign a method instead
end
def my_action
if current_user.nil?
render :layout => "normal_layout"
else
render :action => "could_like_this", :layout => "member_layout"
end
end
Si vous ne voulez pas devenir trop complexe, vous pouvez simplement le faire:
layout 'layout_one'
def new
@user= User.new
render layout: 'landing_page'
end
cela fera l'affaire.
Je suis sûr qu'il y a beaucoup de réponses à cela, mais en voici une autre où vous pouvez utiliser différentes dispositions par contrôleur ou par action.
class ListingsController < ApplicationController
# every action will use the layout template app/views/layouts/listing_single.html.erb
layout 'listing_single'
# the 'list' action will use the layout set in the 'alternative_layout' method
# you can also add multiple actions to use a different layout,just do like layout :alternative_layout, only: [:list,:another_action]
layout :alternative_layout, :only => :list
def show
end
def list
end
private
def alternative_layout
if current_user.is_super_admin?
#if current use is super admin then use the layout found in app/views/layouts/admin.html.erb otherwise use the layout template in app/views/layouts/listing_list.html.erb
'admin'
else
'listing_list'
end
end
end
Oui, vous pouvez utiliser différentes mises en page et feuilles de style au sein des mêmes contrôleurs.
Le guide Rails sur les présentations est un bon point de départ. Regardez Section 3 - Structurer les présentations
Il existe plusieurs façons d'utiliser une disposition différente, mais l'une des plus simples consiste simplement à ajouter un fichier portant le même nom que votre contrôleur dans le layouts/
dossier. Donc, si votre contrôleur est PostsController
alors ajouter un layouts/post.html.haml
entraînerait Rails à utiliser cette disposition. Si aucune telle disposition n'est trouvée et qu'aucune autre disposition n'est spécifiée, Rails utilisera la valeur par défaut de layouts/application.html.haml
Eh bien, si c'est une vue différente pour les appareils mobiles mais que toutes les versions de bureau sont les mêmes, vous pouvez utiliser JQtouch.
http://railscasts.com/episodes/199-mobile-devices
# config/initializers/mime_types.rb
Mime::Type.register_alias "text/html", :mobile
# application_controller.rb
before_filter :prepare_for_mobile
private
def mobile_device?
if session[:mobile_param]
session[:mobile_param] == "1"
else
request.user_agent =~ /Mobile|webOS/
end
end
helper_method :mobile_device?
def prepare_for_mobile
session[:mobile_param] = params[:mobile] if params[:mobile]
request.format = :mobile if mobile_device?
end
Le code ci-dessus est extrait de l'exemple Railscasts.