web-dev-qa-db-fra.com

rails 3, comment ajouter une vue qui n'utilise pas la même disposition que le reste de l'application?

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?

51
jpwynn

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:

Pour modifier le fichier de disposition par défaut pour tous les contrôleurs (c'est-à-dire, utilisez 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

Pour modifier toutes les actions dans un certain contrôleur pour utiliser un autre fichier de disposition

class SessionsController < ActionController::Base
  layout "sessions_layout"
  # similar to the case in application controller, you could assign a method instead
end

Pour modifier une action afin d'utiliser un autre fichier de présentation

def my_action
  if current_user.nil?
    render :layout => "normal_layout"
  else
    render :action => "could_like_this", :layout => "member_layout"
  end
end
129
PeterWong

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.

4
Lesly Revenge

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
4
zechtz

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

3
Dty

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.

1
dannymcc