ruby on rails - new - Los rieles establecen el diseño desde un método before_filter
routes in ruby on rails (3)
¿Es posible restablecer un diseño predeterminado desde un método before_filter en Rails 3?
Tengo lo siguiente como mi contact_controller.rb :
class ContactsController < ApplicationController
before_filter :admin_required, :only => [:index, :show]
def show
@contact = Contact.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.xml { render :xml => @contact }
end
end
[...]
end
Y lo siguiente en mi application_controller.rb
class ApplicationController < ActionController::Base
layout ''usual_layout''
private
def admin_required
if !authorized? # please, ignore it. this is not important
redirect_to[...]
return false
else
layout ''admin'' [???] # this is where I would like to define a new layout
return true
end
end
end
Sé que podría poner ...
layout ''admin'', :only => [:index, :show]
... justo después de "before_filter" en "ContactsController", pero como ya tengo un montón de otros controladores con muchas acciones que se filtran correctamente como requeridas por el administrador, sería mucho más fácil si pudiera restablecer el diseño desde " usual_layout "a" admin "dentro del método" admin_required ".
Por cierto, poniendo ...
layout ''admin''
... dentro de "admin_required" (como lo intenté en el código anterior), aparece un mensaje de error de método indefinido. Parece funcionar solo fuera de las definiciones, al igual que lo hice para "usual_layout".
Gracias por adelantado.
De las guías de Rails , 2.2.13.2 Choosing Layouts at Runtime
:
class ProductsController < ApplicationController
layout :products_layout
private
def products_layout
@current_user.special? ? "special" : "products"
end
end
La forma moderna de hacer esto es usar un proc,
layout proc { |controller| user.logged_in? "layout1" : "layout2" }
Si, por algún motivo, no puede modificar el controlador existente y / o solo desea hacer esto en un filtro anterior, puede usar self.class.layout :special
aquí hay un ejemplo:
class ProductsController < ApplicationController
layout :products
before_filter :set_special_layout
private
def set_special_layout
self.class.layout :special if @current_user.special?
end
end
Es solo otra forma de hacer esencial lo mismo. Más opciones hacen para programadores más felices!