51 votes

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

Je ne pouvais pas trouver toutes les docs ou des exemples sur la façon de structurer mon application pour permettre aux points de vue différents dans le même contrôleur pour utiliser complètement différentes mises en page et les feuilles de style.

Notre application a été échafaudée et puis, nous avons utilisé chouette-générateurs de vues, puis ajouté à concevoir pour l'authentification. Nous avons des vues et des contrôleurs pour les deux modèles: les widgets et les entreprises.

J'ai actuellement une seule mise en page: layouts/de l'application.html.haml, je ne vois pas référencé nulle part alors je suppose (rails débutant) que c'est toujours utilisée par la convention de nommage.

J'ai maintenant besoin d'ajouter un couple de points de vue (pour les navigateurs mobiles) qui ont une autre feuille de style et mise en page (par exemple, pas de login/logout les liens en haut à droite), au sein de la même contrôleurs.

Comment peut-on le faire?

129voto

PeterWong Points 10070

Par défaut, layouts/application.html.haml (.erb si vous n'êtes pas à l'aide de haml).

En fait, le fichier de mise en page pourrait être fixé par le contrôleur ou par l'action, et non par la vue, par dossier de vue.

Il y a quelques cas:

Pour modifier la mise en page par défaut de fichiers pour tous les contrôleur (ie. utiliser 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 changer de toutes les actions dans un certain contrôleur pour utiliser un autre fichier de mise en page

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 à utiliser d'autres fichier de mise en page

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

4voto

Dty Points 7756

Oui, vous pouvez utiliser différentes mises en page et des feuilles de style au sein de la même contrôleurs.

Le guide rails sur les modèles est un bon endroit pour commencer. Regardez la Section 3 - la Structuration de Mises en page

Il y a plusieurs façons d'utiliser une mise en page différente, mais la plus simple est de simplement ajouter un fichier avec le même nom que votre contrôleur dans l' layouts/ le dossier. Donc, si votre contrôleur est - PostsController puis l'ajout d'un layouts/post.html.haml serait la cause de rails pour utiliser cette mise en page. Si une telle disposition se trouve, et pas d'autres modèles sont spécifiés, les rails utiliser la valeur par défaut de layouts/application.html.haml

4voto

Lesly Revenge Points 170

Si vous ne voulez pas aller trop complexe, vous pouvez simplement faire ceci:

layout 'layout_one'

 def new
   @user= User.new
  render layout: 'landing_page'
  end

cela va faire.

1voto

dannymcc Points 941

Eh bien, si c'est un point de vue différent pour les appareils mobiles, mais toutes les versions de bureau sont le même, alors vous pourriez 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 tirée de la Railscasts exemple.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X