rails new mvc create before ruby-on-rails layout before-filter

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!