ruby-on-rails - framework - tutorial django
rails 3, ¿cómo agregar una vista que no usa el mismo diseño que el resto de la aplicación? (5)
Bueno, si se trata de una vista diferente para los dispositivos móviles, pero todas las versiones de escritorio son las mismas, entonces podría usar 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
El código anterior se toma del ejemplo de Railscasts.
No pude encontrar ningún documento o ejemplos sobre cómo estructurar mi aplicación para permitir que diferentes vistas en el mismo controlador utilicen diseños y hojas de estilo completamente diferentes.
Nuestra aplicación fue scaffolded y luego usamos nifty-generators para generar vistas, luego añadimos el diseño para la autenticación. Tenemos vistas y controladores para dos modelos: widgets y compañías.
Actualmente tengo un diseño único: layouts / application.html.haml, no veo que se haga referencia a él en ninguna parte, así que supongo (que es un novato de Rails) que siempre se usa al nombrar las convenciones.
Ahora necesito agregar un par de vistas (para navegadores móviles) que tienen una hoja de estilo y un diseño diferente (por ejemplo, enlaces de inicio de sesión / cierre de sesión en la esquina superior derecha), dentro de los mismos controladores.
¿Cómo se puede hacer eso?
Estoy seguro de que hay muchas respuestas a esto, pero aquí hay otra donde puedes usar diferentes diseños por controlador o por acción.
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
Sí, puede usar diferentes diseños y hojas de estilo dentro de los mismos controladores.
La guía de rieles en los diseños es un buen lugar para comenzar. Mire la Sección 3 - Diseños de Estructuración
Hay varias formas de utilizar un diseño diferente, pero una de las más sencillas es simplemente agregar un archivo con el mismo nombre que su controlador en la carpeta de layouts/
. Entonces, si su controlador es PostsController
entonces agregar layouts/post.html.haml
provocaría que los rieles usen ese diseño. Si no se encuentra dicho diseño, y no se especifican otros diseños, los rieles usarán el predeterminado de layouts/application.html.haml
Si no quiere ir demasiado complejo, simplemente puede hacer esto:
layout ''layout_one''
def new
@user= User.new
render layout: ''landing_page''
end
esto lo hara.
De forma predeterminada, layouts/application.html.haml
( .erb
si no está utilizando haml).
De hecho, el archivo de diseño se puede configurar por controlador o por acción, en lugar de por vista, por carpeta de vista.
Hay algunos casos:
Para cambiar el archivo de diseño predeterminado para todos los controladores (es decir, use another.html.haml
lugar 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
Para cambiar todas las acciones en un controlador determinado para usar otro archivo de diseño
class SessionsController < ActionController::Base
layout "sessions_layout"
# similar to the case in application controller, you could assign a method instead
end
Para cambiar una acción para usar otro archivo de diseño
def my_action
if current_user.nil?
render :layout => "normal_layout"
else
render :action => "could_like_this", :layout => "member_layout"
end
end