Pregunta

en mi solicitud, tengo un modelo de "usuario". Cada usuario puede tener varias direcciones (correo electrónico) que se definen en el modelo de "Dirección":

Class User < ActiveRecord::Base
  has_many :addresses


  def is_authorized(op)
     # returns true or false
  end

  def is_owned_by(user)
     # returns true or false
  end
end

Class Address < ActiveRecord::Base
  belongs_to :user
end

Dentro de la clase AddressController, el usuario actualmente conectado está disponible en la variable de instancia "@user". El controlador evita que los usuarios normales de editar, borrar, etc. visualización direcciones que no pertenecen a ellos - pero sí permite un usuario administrativo para editar los. La clase AddressController puede pedir al AddressModel si el usuario actualmente conectado se realizan operaciones normales o de superusuario.

Todo esto funciona bien y actualizaciones de la base se hacen como se espera, sin embargo, que realmente me gustaría tener diferentes puntos de vista HTML en función del modo de operación. Sólo puedo pensar en dos maneras de lograr lo siguiente:

  1. Hacer el modo de funcionamiento (normal / privilegiada) conocido en la clase AddressController (utilizando una variable de instancia, por ejemplo @privileged) y utilizar un "if" en la vista.
  2. Use algo así como un "after_filter" en el controlador de dirección para hacer un diseño diferente.

Si es posible mostrar los resultados de la ejecución de un solo controlador en dos diseños completamente diferentes, dependiendo de su modo de funcionamiento, lo que es una buena manera de lograr eso?

Gracias de antemano Stefan

¿Fue útil?

Solución

Puede especificar qué vista usar para mostrar el resultado de una acción en la acción misma. También puede especificar el diseño de utilizar también. Así, por ejemplo:

def my_action
  if @user.is_authorised(...)
    render :action => 'admin_action', :layout => 'admin'
  else
    render :action => 'non_admin_action', :layout => 'non_admin'
  end
end

Esto hará que sea admin_action.html.erb o non_admin_action.html.erb en función del valor de regresar de is_authorised. La opción :layout es, er, opcional y se refiere una disposición en vistas / diseños. Hay varias otras opciones de la llamada que se puede encontrar en la documentación de para rendir .

Otros consejos

Usted puede simplemente llamar a los href="http://api.rubyonrails.org/classes/ActionController/Base.html#M000658" rendir método manualmente al final de la acción del controlador:

if @privileged
    render :action => 'show_privileged'
else
    render :action => 'show'
end

Esto hará que app/views/myview/show_privileged.html.erb o app/views/myview/show.html.erb. Como alternativa, puede utilizar la opción :template para dar un archivo de plantilla explícita al método render.

Si este es el único controlador en su aplicación en la que estés, si / else'ing todo el lugar que es probablemente muy bien. Si usted comienza a hacer este tipo de lógica de todo el mundo que debe decirle que usted está haciendo demasiado a la vez.

La respuesta que aceptó (! Que está muy bien y las obras) tiene un diseño diferente y un punto de vista diferente, que me dice que el controlador está haciendo demasiado -. Me dividir esto en un controlador de administración

Usted debe poner las acciones administrativas en un espacio de nombres de un administrativo y restringirlo allí. Crear un directorio llamado admin en el directorio de controladores y añadir un _application_controller.rb_ allí:

class Admin::ApplicationController < ApplicationController
  before_filter :check_authorized

  private
    def check_authorized?
      if !logged_in? || !current_user.admin?
        flash[:notice] = "You've been very bad. Go away.
        redirect_to root_path
      end
    end
 end

Ahora usted puede poner controladores en este espacio de nombres y hacer que se heredan de Admin::ApplicationController también.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top