¿Qué puede hacer ASP.NET MVC y Ruby on Rails no? [cerrado]

37

ASP.NET MVC y Rails tienen un área de uso similar, están construidos alrededor de la misma arquitectura, ambos marcos son relativamente nuevos y de código abierto.

Entonces, como programador de Rails, me gustaría saber qué puede hacer ASP.NET MVC y Ruby on Rails, y viceversa.

Nikita Barsukov
fuente
Gran pregunta Soy un desarrollador de MVC y estoy ansioso por saber la respuesta a esto.
StuperUser
14
Este tipo de preguntas son abiertas y se responden mejor cursando la web en mi humilde opinión. ¿Qué puede hacer un BMW 335 que una Hyundai Sonata no puede hacer? Ambos tienen 4 intentos, un volante y están construidos en el mismo marco de consumo; combustible. Estas preguntas de la superficie debido a la falta de investigación sobre la comprensión de los temas dados que puede facilitar una pregunta más directa .... Estoy seguro de que muchos no estarán de acuerdo ya que este es programadores ...
Aaron McIver
1
@ Aaron - Aunque tuve problemas para agregar una respuesta a esta pregunta, estoy de acuerdo con usted en principio, y espero haber dejado en claro que para pedir prestado su análogo, estamos comparando un automóvil con otro.
Adam Crossland
10
Personalmente pensé que era una pregunta válida. Tales preguntas no deberían ser derribadas tan fácilmente porque muchos de nosotros solo conocemos un lado de la historia y también ayuda a tener una idea del otro lado. Por cierto, hacer una pregunta sobre StackExchange califica como investigación en mi libro.
Umar Farooq Khawaja
3
Hago preguntas como esta a menudo y las derribo, así que me gustaría mostrar algo de apoyo aquí para el OP. Las decisiones tomadas al codificar son casi siempre subjetivas. Mi derecho podría ser su error, mientras que ambos podrían desarrollar soluciones de trabajo de igual mérito (subjetivo). En este caso, el OP quiere opiniones sobre los méritos relativos de dos tecnologías opuestas. No encontrará esa información en ninguna parte, excepto en las mentes de aquellos que han pasado por el proceso práctico de elegir una sobre la otra. Por lo tanto, es una pregunta legítima.
Ian

Respuestas:

31

He desarrollado aplicaciones reales con Rails y ASP.NET MVC, pero esta respuesta viene con una advertencia importante: aprendí y desarrollé con Rails anteriores a la versión 2, por lo que es muy posible que esté muy desactualizado con mi Rieles de conocimiento.

Dicho esto, no creo que no hay nada que se pueda hacer con uno pero no el otro. Dado cualquier conjunto de requisitos para una aplicación web, debería poder construir esa aplicación, probablemente de manera igualmente eficiente, con Rails o ASP.NET MVC.

Hay un par de cosas interesantes que, que yo sepa, están disponibles en ASP.NET MVC principalmente debido a aspectos de C # /. NET. Por ejemplo: cuando tengo una página que contiene un formulario que se envía, tendría una Acción que verifica si se trata de un GET o un POST para decidir qué hacer:

def edit
  @item = Item.find(params[:id])

  if request.post? 
    @item.update_attributes(params[:item])
    redirect_to :action => 'edit', :id => @item.id 
  end
end

Este es un ejemplo trivial, pero el if request.post?patrón es extremadamente común en Rails. Para casos no triviales, el código de acción puede volverse grande y desordenado y, a menudo, desearía poder refactorizarlo en métodos separados limpiamente. En ASP.NET MVC puedo hacer eso:

public ActionResult Edit() {
  // Render my page that has the Edit form
  ...
}

[HttpPost]
public ActionResult Edit(Foothing foo) {
  // Save my Foothing data
  ...
}

Creo que es capaz de separar limpiamente el manejo de las solicitudes GET y POST. Su experiencia puede ser diferente.

La otra cosa que ASP.NET MVC hace que es súper genial (nuevamente en mi opinión) también está relacionada con el manejo de POSTS de formulario. En Rails, tengo que consultar el paramshash para todas mis variables de formulario. Digamos que tengo un formulario con los campos 'estado', 'gonkulated', 'invert' y 'disposition':

def edit
  @item = Item.find(params[:id])

  if params[:status] == "new"
    ...
  else
    ...
  end

  if params[:gonkulated] == "true"
    ...
  else
    ...
  end

  if params[:invert] == "true"
    ...
  else
    ...
  end

  # Rest ommited for brevity
end

Pero ASP.NET MVC me permite obtener todos mis valores de formulario como parámetros para mi método de acción:

[HttpPost]
public ActionResult Edit(int id, string status, bool gonkulated, bool invert, int disposition) {
    ...
}

Esas son las dos cosas que realmente me encantaron de ASP.NET MVC o Rails. No son razón suficiente para que un desarrollador cuerdo o competente elija un marco sobre el otro.

Adam Crossland
fuente
66
En cuanto a los parámetros de acción: habría pensado que public ActionResult Edit(Foothing foothing), es decir, las características de ModelBinder eran aún más ordenadas.
rmac
10
Los ejemplos de rieles están bastante desactualizados. Funcionan, pero hay mejores formas de hacerlo.
Jason w
2
@ Jason: ¿te gustaría ampliar esto y tal vez publicar una idea general ?
Dan
3
Acepto que la request.post? A mí también me parece inusual (tal vez porque se usó en versiones anteriores). Comencé con Rails 3 y el método de edición siempre es un 'get'. Supongo que podría configurarlo para que sea una publicación, pero Rails usa un patrón RESTful que usaría un método de 'actualización' para publicar cualquier cambio que ocurra en un modelo. Entonces, si se hace correctamente, ni siquiera debería verificar si el método 'editar' era una publicación.
PhillipKregg
3
Votarte simplemente porque presentas un argumento sensato. Prefiero Rails, pero es completamente subjetivo y defiendes bien tu caso.
Steve Hill
6

Una ventaja de ASP.NET MVC sobre Rails es si necesita crear una nueva aplicación sobre una base de datos existente. ActiveRecord de Rails es muy obstinado acerca de cómo deben estructurarse las tablas (la tabla debe tener una y solo una columna entera como clave principal llamada 'id', etc.), por lo que si sus tablas existentes no se ajustan a las preferencias de ActiveRecord, es difícil hacer ActiveRecord trabajo. ¡Pero desarrollar una nueva aplicación con nueva base de datos con ActiveRecord y Rails es rápido!

ASP.NET MVC no tiene ORM predeterminado. Puede elegir una estrategia de acceso a datos que se ajuste a sus necesidades. Algunos ORM como nhibernate pueden soportar bases de datos heredadas. Puede tener clave primaria guid, etc.

Hay una alternativa a Rails ActiveRecord llamada DataMapper , pero no lo he probado.

Endy Tjahjono
fuente
99
El ActiveRecord de Ruby le permite eliminar una gran cantidad de código si sigue ciertas convenciones, pero no es obligatorio. Si no se siguen las convenciones, entonces debes ser más explícito.
Kevin Cline
1
ASP.NET MVC tiene el Entity Framework para ORM, que ha sido bastante impresionante hasta ahora en mi experiencia con él.
Cooper el
Si por asombroso te refieres a ejecutar consultas mal generadas 20 veces más lento que el SQL escrito correctamente, entonces sí;) ... Dapper Contrib es algo que he encontrado genial y rápido ...
niico
2

Después de haber usado ambos, la respuesta IMO es que ASP.NET MVC es más flexible que Rails si su aplicación necesita hacer más que solo leer / escribir desde una base de datos. En mi experiencia, Rails se descompone rápidamente y fuertemente en el momento en que introduce cualquier tipo de complejidad o lógica a la aplicación más allá de la lógica CRUD muy trivial. ASP.NET MVC no encuentra esta restricción ya que es más "abierto" sobre lo que puede hacer.

En igualdad de condiciones en una aplicación CRUD "Web 2.0" típica, no hay nada que uno pueda hacer sobre el otro, sino una aplicación más complicada que necesita un flujo de trabajo o fuentes de datos dispares, o para interactuar con otra aplicación, o cualquier otra cosa. eso no es CRUD típico, ASP.NET puede hacer mucho más y no ser tan restrictivo como Rails.

Wayne Molina
fuente
99
-1 No veo ninguna razón por la cual ASP.NET MVC se consideraría más flexible: si observa los componentes principales, el enrutamiento, los controladores, el renderizado, todos son solo arranques de rieles y también faltan muchas características.
scottschulthess
1
¿Cómo es asp.net mvc 'más abierto'? Puedo omitir todo el andamiaje y hacer que mis modelos y controladores partan desde cero, además de crear asociaciones anidadas, una a muchas, muchas a una, muchas a muchas, sin ningún tipo de "falla". Y, si decido usar un front-end pesado de JavaScript, puedo enviar fácilmente todos los datos de mi modelo al cliente en JSON (o XML, o cualquier otro formato). Además, si puede pensar en una funcionalidad que le gustaría implementar, entonces probablemente ya haya una gema para eso. No es difícil encontrar aplicaciones Rails no triviales.
PhillipKregg
2
¿Ser capaz de desplegarse en el marco bruto de c # / .net podría considerarse más flexible?
Chris Barry
2
Muy tarde en esto, pero lo que quise decir con esta publicación es ASP.NET MVC le permite caer a C # /. NET y aprovechar todo el marco. Rails en ese momento (¿creo que alrededor de 2.0? No puedo recordar) básicamente hizo CRUD muy fácil y todo lo demás difícil; el proyecto en el que estaba trabajando cuando escribí esto se hizo en Rails (mi error) y se desglosó en el momento en que estábamos haciendo una lógica más allá de "leer de la base de datos, mostrar en la página", si lo hubiera hecho en C # / ASP.NET MVC ( 1.0 en este punto IIRC) No habría encontrado muchos de los problemas que hice al elegir Rails para la aplicación.
Wayne Molina
2

Nunca he trabajado con Ruby on Rails, por lo que no estoy exactamente calificado para responder a esta pregunta, pero una cosa que me gusta de ASP.NET MVC es la seguridad de los tipos. Esto viene en camino. Adam Crossland y rmac lo mencionaron brevemente en sus comentarios, pero me gustaría señalar que con un método de controlador como el siguiente, cada uno de los parámetros estará fuertemente tipado. Esto hace que el código dentro del método Edit sea mucho más limpio, ya que no tiene que preocuparse por convertir las representaciones de cadenas en variables escritas correctamente.

[HttpPost]
public ActionResult Edit(int id, string status, bool gonkulated, bool invert, int disposition) {
    ...
}

El otro lugar donde se muestra este tipo de seguridad es en Vistas y Vista parcial, donde se puede asociar una vista de vista parcial con un objeto C # antiguo sin formato, que servirá como modelo de esa Vista o Vista parcial. Esto hace la vida mucho más fácil, especialmente donde desea construir una jerarquía de vistas que contienen otras vistas.

Si se Infinity.ViewModels.Sitellama el espacio de nombres que contiene una clase ContactViewModel, entonces para las vistas Razor, lo hace colocando una línea como esta en la parte superior de la vista:

@model Infinity.ViewModels.Site.ContactViewModel

y para las vistas ASPX, lo hace declarando la vista de esta manera:

<%@ Page Language="C#" ="~/Views/Shared/Site.master" ="System.Web.Mvc.ViewPage<Infinity.ViewModels.Site.ContactViewModel>" %>

Asocia la instancia real del objeto modelo con la vista en el método de acción Controlador y luego accede a la instancia del objeto modelo en la vista por la Modelpropiedad de la vista.

Este tipo fuerte, para mí, es súper genial. El equipo que creó ASP.NET MVC ha realizado un gran esfuerzo para hacer que cada una de las 3 áreas de Modelo, Vista y Controlador esté fuertemente tipada.

No estoy seguro de si Ruby-on-Rails tiene esto, pero espero que sí.

Umar Farooq Khawaja
fuente
El lenguaje Ruby también está fuertemente tipado (también tipeado en pato). Y Rails usa el registro activo para asociar automáticamente sus modelos con sus vistas. No necesitaría declararlos en el controlador. Si quisiera crear una jerarquía anidada de vistas, crearía una variable de instancia en el controlador que representara los modelos que le gustaría pasar a la vista. Entonces sí, ambos pueden hacer lo mismo.
PhillipKregg
1

Son muy similares, y todos pueden "hacer lo mismo" principalmente, solo algunas cosas son más fáciles en una y más difíciles que otras.

Utilicé ASP.NET MVC alrededor del lanzamiento original y definitivamente fue un clon de Rails menos el registro activo. Por lo tanto, Rails casi seguramente tiene un conjunto de características mucho más grande y un ecosistema de complementos / gemas mucho más grande.

scottschulthess
fuente
2
Es cierto, pero Rails también ha existido durante aproximadamente 8 años, por lo que tiene una ventaja. Vengo de Rails a asp.net y MVC 3 es realmente muy agradable. Entity Framework y el administrador de paquetes NuGet me han impresionado hasta ahora.
PhillipKregg
1

En mi experiencia limitada, la principal ventaja de ASP.NET MVC es que es un lenguaje compilado. Esto le permite detectar algunos errores de programación ya en la compilación, donde Ruby tiene que confiar en detectarlos durante las pruebas unitarias.

Además, el hecho de que se compila permite tener herramientas de refactorización avanzadas, por ejemplo, cambiar el nombre de una propiedad en un lugar, y todas las referencias a la propiedad se cambian. Esto al menos no se puede hacer en TextMate, que utilizan muchos desarrolladores de Rails.

Por otro lado, la principal ventaja de Ruby on Rails es que es un lenguaje interpretado;) La naturaleza de Ruby, cómo puede modificar cualquier objeto en la memoria, o parchear un mono en una clase, puede conducir a algunas soluciones muy elegantes; mira el libro Eloquent Ruby para ver algunos ejemplos. Y gran parte del marco de Rails se basa en esta capacidad.

La capacidad de reemplazar cualquier método en cualquier objeto en cualquier momento también me ha ayudado mucho al escribir pruebas unitarias. En .NET, la inyección de dependencias y los contenedores IOC son prácticamente requisitos para crear código comprobable. Eso no es necesario en Ruby.

Editar:

Después de pensarlo, probablemente la característica principal de Rails es la migración de la base de datos. El marco ASP.NET MVC no proporciona en sí mismo ningún soporte de base de datos. El marco .NET tiene algunos componentes de acceso a datos / ORM, por ejemplo, Entity Framework y Linq to Sql. Pero no tiene ninguna herramienta para diseñar la estructura de la base de datos.

Si paga por una de las versiones más costosas de VS, puede obtener Data Dude , que le permite diseñar un esquema de base de datos y tener algunas herramientas para implementar el esquema en una base de datos. Pero por lo que puedo decir, el soporte para manejar las migraciones de versiones anteriores de la aplicación es muy limitado.

Algunos afirman que ASP.NET MVC no es realmente un marco MVC, simplemente un marco VC, debido a la falta de soporte para la migración de la base de datos.

Editar (nuevamente):

Los cambios en la cadena de herramientas / EF de Visual Studio han introducido migraciones basadas en código desde mi última edición. (pero también echa un vistazo a FluentMigrator si vas por ese camino)

Pete
fuente
2
Entity Framework 5.0 Code First admite migraciones
hofnarwillie
En realidad, las primeras migraciones de código han sido compatibles desde 4.1, que fue lanzado AFAIK no mucho después de mi edición.
Pete
-1

Mi principal problema con MVC 3 de Microsoft y Entity Framework son sus principios de diseño asombrosamente malos.

Uno de los primeros problemas con los que me topé fue cuando utilicé otra clase como propiedad e intenté crear una lista desplegable para los posibles valores.

Para ilustrar mi punto, digamos que tiene dos clases de modelos como este:

public class Color
{
    public int ID { get; set; }
    public string Name { get; set; }
}

public class Thing
{
    public int ID { get; set; }
    public string Name { get; set; }
    public virtual Color Color { get; set; }
}

Crear la propiedad Color sería suficiente para un ORM real pero no para EF. Debe agregar una ID redundante para la propiedad Color en la clase Thing de la siguiente manera:

public class Thing
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int ColorID { get; set; }
    public virtual Color Color { get; set; }
}

Si no agrega el campo de ID redundante para una referencia de objeto extraño, no puede crear fácilmente listas desplegables con todas las opciones posibles de la clase vinculada.

Este es un diseño realmente terrible, ya que combina fuertemente el funcionamiento interno de una clase con otra. La cosa no debería saber nada sobre ColorID, la clase Color debería manejar sus propias verificaciones de igualdad sin exponer que incluso tiene una ID.

Estas son las mejores prácticas 101 cosas, pero aparentemente Microsoft desconoce por completo los principios básicos de la informática y la programación orientada a objetos. [/ Rant]

Mike Bethany
fuente
8
No necesita una propiedad de clave externa en los objetos de marco de su entidad. Además, EF es un producto completamente separado y no está integrado con ASP.NET MVC de ninguna manera. Debería utilizar los modelos de vista para construir su interfaz de usuario y crear listas desplegables u otros controles.
Lucifer Sam
Estoy de acuerdo. No debería tener ninguna clave de ID en absoluto en los marcos de su entidad. Un ORM debe manejar la identidad del objeto. Pero punto tomado; Realmente me estoy quejando más sobre el terrible EF ORM. Ese ejemplo es una versión simplificada que viene directamente de Microsoft por cierto. Así es exactamente como lo hacen en su ejemplo de ContosoUniversity. Esto habla a mi punto. Microsoft no sabe cómo hacer MVC u ORM y sus ejemplos lo muestran.
Mike Bethany
1
Agregar la propiedad ColorID le permite implementar patrones de carga diferida que a veces es muy útil. Por ejemplo, si el objeto al que se hace referencia es muy grande y realmente no necesita todos los valores de propiedad del objeto, sería una pérdida de tiempo de procesamiento buscarlo todo solo para encontrar la parte de ID asociada (ColorID) . También le permite implementar claves foráneas anulables / no anulables, es decir, ¿qué pasa si no siempre se necesita color? Cambie el ColorID a un entero int?
anulable