Un controlador, diferentes vistas para usuarios normales y los administradores
-
19-09-2019 - |
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:
- 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.
- 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
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
Puede especificar el diseño de la vista para ese controlador particular, o toda la aplicación en el controlador de aplicación por:
class SomeController < ApplicationController
layout :set_layout
def set_layout
@user.is_authorized(...) ? "privileged_layout" : "normal_layout"
end
...
end
Se puede tratar de averiguarlo aquí: http://guides.rubyonrails.org /layouts_and_rendering.html#using-render , bajo 2.2.12 Búsqueda de Presentaciones
Espero que esto ayude =)
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.