2009-04-15 13 views
5

Sé que es mejor mantener el código fuera de la capa de presentación. Pero, me pregunto cuánto se considera "aceptable". Por ejemplo, llene un cuadro de selección html con esta línea de código.¿Cuánto código en una vista de rieles está bien?

CodesecureProject.find(:all,:order => 'name').collect {|project| [project.name, project.id] } 

Ahora tengo esta línea de código incrustada en el formulario. Lo que me pregunto es si la comunidad piensa que si se trata de mucho código y se debe almacenar primero en una variable de instancia en el controlador y luego en la variable utilizada en el formulario.

Respuesta

5

utilizo el siguiente método estático en un modelo de sitio para lograr algo similar:

class Site 
    def self.select_options 
    Site.find(:all, :order => 'UPPER(name)').collect {|s| [s.name, s.id]} 
    end 
def 

Luego, en mi opinión Dominio I llaman:

<%= f.select :site_id, Site.select_options %> 

Esto funciona muy bien para estas circunstancias.

En su caso, es posible que trate:

class CodesecureProject 
    def self.select_options 
    CodesecureProject.find(:all, :order => 'name').collect {|p| [p.name, p.id]} 
    end 
end 

y luego llamar a través de la vista con:

<%= f.select :codesecure_project_id, CodesecureProject.select_options %> 
+1

Si tiene una lista de algo que no cambia, como estados o países, puede incluso hacer una constante de clase y luego solo se carga una vez por instancia de Rails. –

1

Tengo un montón del mismo código en mis proyectos, excepto que trato de no hacer ningún hallazgo. En su caso haría un ámbito con nombre

named_scope :order, lambda { |order| {:order => order}} 

y hacer que el código:

CodesecureProject.order(:name).collect {|project| [project.name, project.id] } 

Es un poco más limpio.

Si tiene muchas cajas de selección que necesitan un nombre y una identificación (estoy seguro de que a veces), también podría intentar hacer una ayuda que exceptúe un ModelName y devuelva la matriz que necesita.

def magic_for_select(model) 
    model.all.collect{|instance| [instance.name, instance.id]} 
end 
+0

llamando a su alcance "ordered_by" en realidad lo haría este código muy natural para leer! –

5

No voy a decir que nunca lo haría (estaría mintiendo) pero el ejemplo de código dado me pondría nervioso. Creo que estaría más inclinado a entregar los datos a la casilla de selección de mi controlador. Un método de ayuda es otra opción si noto que estoy haciendo algo más de una vez. Es más probable que vea la duplicación en el controlador que en distintas vistas.

Si utilizo el mismo componente HTML en varias vistas, podría encontrar extensiones parciales o envolver todo en una ayuda personalizada: project_select() o algo así.

Cuanto más trabajo en el mundo de MVC, más me encuentro evitando el código en las vistas. Tengo la sensación de que se alcanzará algún tipo de dominio Zen si alcanzo el estado de código cero, aunque el valor de eso en cualquier cosa que no sean términos filosóficos es muy discutible.

1

Iría un poco más lejos que Maran. Generalmente hago lo siguiente:

  • Cree un named_scope en el modelo para ejecutar el descubrimiento.
  • Llame al named_scope desde el controlador y almacene los resultados en una variable de instancia.
  • Solo ponga la variable de instancia en la vista.

Solo usaría un ayudante si fuera absolutamente necesario. Cuando revise su código más tarde, es más fácil dar sentido a las cosas si ve que su controlador configura los datos que necesita la vista, en lugar de la vista que llama al ayudante (otro archivo más para mirar).

Cuestiones relacionadas