En Ruby on Rails Desarrollo (o MVC en general), lo rápido regla debo seguir en cuanto a donde poner la lógica.

Favor de una respuesta afirmativa – Con no poner esto aquí, en lugar de no ponen que hay.

InformationsquelleAutor theschmitzer | 2008-09-13

10 Comentarios

  1. 169

    MVC

    Controlador de: Pon aquí el código que tiene que ver con el trabajo fuera lo que un usuario quiere, y decidir qué regalar a ellos, trabajar si se registran, si deben ver a ciertos datos, etc. En la final, el controlador examina las solicitudes y lo que los datos (Modelos) para mostrar y qué Vistas a procesar. Si usted está en duda sobre si el código debe ir en el controlador, entonces probablemente no. Mantenga sus controladores flaco.

    Ver: La vista sólo debe contener el mínimo de código para mostrar los datos (Modelo), no debería hacer un montón de procesamiento o cálculo, se deben mostrar los datos calculados (o resumen) por el Modelo, o generado por el Controlador. Si su Vista realmente necesita para hacer de procesamiento que no se puede hacer por el Modelo o el Controlador, poner el código en un Ayudante. Porciones del código Ruby en un punto de Vista hace que las páginas de marcado difícil de leer.

    Modelo: el modelo debe ser donde todos el código que se refiere a los datos (las entidades que conforman el sitio, por ejemplo, a los Usuarios, Correos, Cuentas, Amigos, etc.) vidas. Si en el código se debe guardar, actualizar o resumir los datos relacionados con sus entidades, ponerlo aquí. Va a ser re-utilizable a través de sus Vistas y Controladores.

    • Gran enlace para el ‘flaco’ – excelente descripción de la MVC.
    • La gente está empezando a alejarse del modelo de la grasa. Me gusta pensar en mi modelo como una estructura de datos. Luego escribo algo de Ruby objeto que implementa el comportamiento, iniciándola con el modelo (se trata del modelo de datos en la misma forma en que se podría tratar de cadenas y de las matrices de datos en los objetos que están fuera de los Rieles). Aquí un buen video con un ejemplo de esta técnica.
    • No estoy seguro de nada de grasa puede ser visto como una buena cosa. Toneladas de responsabilidades están mejor fuera de pertenencia en los servicios.
  2. 34

    Para agregar a pauliephonic la respuesta:

    Ayudante: funciones para hacer que la creación de la vista más fácil. Por ejemplo, si estás siempre de iterar sobre una lista de widgets para mostrar su precio, lo puso en un helper (junto con un parcial para la visualización real). O si usted tiene un pedazo de RJS que no quieren estorbar encima de la vista, lo puso en un ayudante.

  3. 13

    El patrón MVC es la que realmente se preocupa sólo de la interfaz de usuario y nada más. Usted no debe poner ningún tipo de complejos, lógica de negocio en el controlador, ya que los controles de la vista, pero no de la lógica. El Controlador debe ocuparse de la selección de la vista correcta y delegar más cosas complejas para el modelo de dominio (Modelo) o la capa de negocio.

    Domain Driven Design tiene un concepto de Servicios, el cual es un lugar que le pegan en la lógica que debe orquestar un número de diversos tipos de objetos que por lo general significa una lógica que no pertenecen naturalmente en una clase del Modelo.

    Me suelen pensar que la capa de Servicio como la API de mis aplicaciones. Mis Servicios capas generalmente mapa muy de cerca a los requisitos de la aplicación que estoy creando así el Servicio de la capa actúa como una simplificación de las interacciones más complejas se encuentran en los niveles más bajos de mi aplicación, es decir, se podría lograr el mismo objetivo eludir el Servicio capas pero usted tendría que tirar un montón más palancas para hacer que funcione.

    Nota que no estoy hablando de los Rieles aquí estoy hablando de un general de estilo arquitectónico que solucione su problema en particular.

  4. 7

    No poner cosas relacionadas con la autorización y control de acceso en el controlador.

    Modelos son todos acerca de sus datos. La validación, las Relaciones, la SUCIEDAD, la Lógica de Negocio

    Puntos de vista se trata de mostrar los datos. De visualización y obtención de entrada solamente.

    Controladores son acerca de cómo controlar qué datos va desde el modelo a la vista (y la vista) y desde su punto de vista a su modelo. Los controladores también pueden existir sin modelos.

    Me gusta pensar en el controlador como un guardia de seguridad/recepcionista que dirige a usted, el cliente(solicitud) para el contador apropiado donde se le pregunta a un cajero (ver) una pregunta. El narrador (punto de vista), luego se va y llega la respuesta de un administrador (modelo), que nunca se ve. La solicitud, a continuación, volver a la guardia de seguridad/recepcionista (controlador) y esperar hasta que se le indique de ir a otro cajero (ver) que le dice a usted la respuesta de la gerente (modelo) les dijo en respuesta a los otros del cajero (vista) de la pregunta.

    Del mismo modo, si usted quiere decir el narrador (punto de vista), algo que, a continuación, en gran medida, sucede lo mismo, excepto el segundo cajero le dirá si el administrador de la aceptación de su información. También es posible que el guardia de seguridad/recepcionista (controlador) puede haberle dicho a usted que tome una caminata ya que no estaban autorizados para decirle al administrador de esa información.

    Para extender la metáfora, en mi estereotipados y poco realista del mundo, los cajeros (vistas) son bonita pero vacía de cabeza y a menudo creen cualquier cosa que les diga, guardia de seguridad/recepcionistas son mínimamente educado, pero no están muy informados, pero ellos saben donde la gente debe y no debe ir y gerentes son realmente feo y media, pero sabe todo y puede decir lo que es verdadero y qué no lo es.

  5. 4

    Una cosa que ayuda a separar correctamente, es evitar que el «pase de las variables locales del controlador a la vista» anti-patrón. En lugar de esto:

    # app/controllers/foos_controller.rb:
    class FoosController < ApplicationController
    
      def show
        @foo = Foo.find(...)
      end
    
    end
    
    #app/views/foos/show.html.erb:
    ...
    <%= @foo.bar %>
    ...

    Trate de mover a un captador que está disponible como un método auxiliar:

    # app/controllers/foos_controller.rb:
    class FoosController < ApplicationController
    
      helper_method :foo
    
      def show
      end
    
      protected
    
      def foo
        @foo ||= Foo.find(...)
      end
    
    end
    
    #app/views/foos/show.html.erb:
    ...
    <%= foo.bar %>
    ...

    Esto hace que sea más fácil para modificar lo que se pone en «@foo» y cómo se utiliza. Aumenta la separación entre el controlador y la vista, sin hacer más complicado.

    • uhmmm… Yuk. Por favor, puedes agregar algunas buenas razones/escenarios para cuando usted hace esto. De esta forma se rompe el BESO y YAGNI y es muy oloroso (sólo para tirar en uno de los más cliché)
    • 1) Rieles de hace un montón de magia para copiar el controlador de variables de instancia a la vista de la instancia. 2) La propuesta de aplicación también sólo carga los foo si se accede, que puede ahorrar un poco de trabajo por algún tiempo. La importante respuesta es realmente 1), sin embargo.
    • Suspiro Esto es terrible. Rieles de la variable de instancia para compartir es una característica que no es un anti-patrón. Es una omnipresente, bajo-mental-sobrecarga de azúcar sintáctico que rara vez causa problemas del mundo real. Si no te gusta, bien, pero la codificación de alrededor con un barroco no estándar de la estructura hace que las cosas infinitamente peores. En este caso, se está haciendo foo global (por controlador de todos modos) de la variable. Tratando de corregir un abuso percibido del ámbito de las variables se incrementa drásticamente el ámbito de aplicación es sumamente irónico.
    • No lo voy a comprar, dasil003. El alcance de foo y de @foo son los mismos-que son tanto en el ámbito de la <ControllerClass, solicitud> par. Además, mediante el uso de la función de captador versión, puedo cambiar la forma en que Foo objeto se encuentra almacenado//en caché sin necesidad de cambiar el modo de la vista de los accesos de la misma.
    • Creo que te refieres a «pasar las variables de instancia» anti-patrón. Una instancia var se fuga de estado para la totalidad de procesamiento, incluso en anidada parciales. Su solución también las fugas de estado, sino que es ligeramente mejor que una instancia var porque no permite la reasignación. Pasar de un local es la mejor porque es como se llama a un método; el local no puede ser visto por los parciales. Consulte esta respuesta.
    • El código en esta respuesta no tiene variables locales, ni en el «malo» ni «bueno» de la versión. ¿Qué quiere decir que las variables locales?
    • Cuando usted tiene foo como un método auxiliar en la vista, sólo se puede leer de ella, mientras que si desea utilizar @foo – se pueden leer/escribir… así que parece que el uso de foo como un método auxiliar es más seguro.
    • En MVC, los controladores son los orquestadores de puntos de vista. Ellos comparten el mismo ámbito por una razón. Esta solución propone la adición de un juego de teléfono para cada vista sólo para prevenir accidentes en la variable de reasignación dentro de las vistas. He sido codificación de Rieles de aplicaciones para 10 años y nunca he accidentalmente hecho. Los Rieles de la convención es asignar a las variables de instancia en los controladores, a continuación, deje que las vistas decidir cómo usarlos. Esto me da la flexibilidad para utilizar instancia vars directamente en los parciales o pasar a compartido parciales como locales, la mejora parcial de la reutilización de código. ¿Por qué se acumulan con el controlador para pedante?

  6. 2

    Bien, de alguna manera, depende de lo que la lógica tiene que lidiar con…

    A menudo, tiene sentido para empujar más cosas en sus modelos, dejando a los controladores de los pequeños. Esto asegura que esta lógica se puede utilizar fácilmente desde cualquier lugar usted necesita para acceder a los datos que el modelo representa. Puntos de vista deben contener casi ninguna lógica. Así que en realidad, en general, usted debe tratar de hacer lo que no se Repita a sí Mismo.

    También, rápidamente un poco de google revela un par de ejemplos más concretos de lo que va a donde.

    Modelo: validación de requisitos, las relaciones entre los datos, crear métodos, métodos de actualización, destruir métodos, métodos de búsqueda (tenga en cuenta que usted debe tener no sólo las versiones genéricas de estos métodos, pero si hay algo que están haciendo un montón, como encontrar a gente con el pelo rojo por el apellido, entonces usted debe extraer que la lógica, de modo que todo lo que tienes que hacer es llamar a la find_redH_by_name(«smith») o algo así)

    Ver: Esto debe ser todo sobre el formato de los datos, no el procesamiento de datos.

    Controlador: aquí es donde el procesamiento de datos se va. De internet: «El controlador tiene el propósito de responder a la acción solicitada por el usuario, tomar los parámetros que el usuario ha establecido, el proceso de los datos, interactuar con el modelo y, a continuación, pasar los datos solicitados, en forma definitiva, a la vista.»

    Espero que ayude.

  7. 0

    En términos simples, en general,
    Modelos tendrá todos los códigos relacionados con la tabla(s), sus simples o complejas relaciones (piense en ellos como sql de consultas de varias tablas), la manipulación de los datos/variables para llegar a un resultado con el uso de la lógica de negocio.

    Controladores de tendrá código/punteros hacia los modelos pertinentes para el trabajo solicitado.

    Vistas va a aceptar la entrada del usuario/interacción y visualización de la resultante de la respuesta.

    Cualquier desviación importante de estos va a poner no deseados de tensión en esa parte y el rendimiento global de la aplicación puede obtener afectados.

  8. -1

    Probando, Probando …
    Poner tanta lógica como sea posible en el modelo y, a continuación, usted será capaz de probar adecuadamente. Unidad de pruebas de los datos y la forma en que se está formada por la prueba del modelo, y las pruebas funcionales de la prueba de la forma en que se dirige o controla mediante las pruebas de los controladores, por lo que se deduce que no se puede probar la integridad de los datos a menos que sea en el modelo.

    j

Dejar respuesta

Please enter your comment!
Please enter your name here