2011-01-24 15 views
11

Estoy empezando en Rails y todavía tengo que aprender mucho, así que es probable que esté en Stackoverflow más de lo normal haciendo preguntas de principiante Rails/Ruby.Ayudantes en rieles

Estoy tratando de descubrir cómo funcionan los Ayudantes en Rails. Por lo que he visto hasta ahora, los helpers están destinados a ser utilizados con Views y no tanto con tus controladores.

Sin embargo, me gustaría hacer una función simple que valide la entrada del usuario dada en params (verifique si se definen ciertos params y opcionalmente verifique si su valor es válido).

¿Alguien me puede explicar cuál sería la mejor manera de implementar esto? (Teniendo en cuenta que querré utilizar esto en muchos controladores diferentes, así debería estar disponible globalmente).

También noté que, por defecto, Rails no genera una carpeta lib en la carpeta principal de la aplicación. ¿Los desarrolladores deben colocar sus bibliotecas fuera de la carpeta de la aplicación en la carpeta principal, o Rails usa las bibliotecas de forma diferente?

Respuesta

20

En cuanto a su problema de validación, depende de lo que valide.

Si los datos constituyen objetos del dominio de su problema, también conocidos como modelos, entonces debe usar los validadores incorporados de ActiveModel. Esto es probablemente lo que debes hacer, pero es difícil de decir sin saber el problema exacto. Vea el Rails Guides on Validations. Puede decir si este es el caso preguntándose si los datos que necesitan validación se almacenarán después de obtenerlos. Si es así, definitivamente es un modelo. Un ejemplo de este tipo de datos serían los campos de título y texto de una publicación de blog enviada a Rails desde un formulario de navegador.

Si los datos son algo terciario para sus modelos, o específicos para la presentación, entonces debería estar bien usando ayudantes. ¿Ha notado que los ayudantes se utilizan sobre todo en los puntos de vista, y aunque esto es cierto, no hay nada que nos impida su uso en los controladores, sólo hay que declarar que las vas a usar con el método ActiveController#helper. Dentro de la clase ApplicationController, muchos desarrolladores pondrán helper :all para incluir todos los helpers en todos los controladores. Una vez que el código ha sido requerido una vez, realmente no incurre en ese gran impacto de rendimiento.

Tenga en cuenta que casi todos los datos entrantes se pueden modelar utilizando un modelo. Una gran escuela de pensamiento en el mundo de Rails se suscribe a la idea de Fat Model. La gente dice que poner tanto código como sea posible en el modelo y tan poco en el controlador como sea posible separa las preocupaciones correctamente y conduce a un código más fácil de mantener. Esto sugiere que incluso si no cree que los datos entrantes son modelables (en el sentido de que puede crear un modelo para representarlo), debe tratar de convertirlo en un modelo y encapsular la lógica para validarlo. Sin embargo, puede encontrar que hacer una función auxiliar es más rápido y cualquiera de los dos funcionará.

Su noción de validar la entrada del usuario es buena. Tengo la sensación de que, como eres nuevo en Rails, estás acostumbrado a hacer estas cosas tú mismo, pero eso no se aplica aquí. En el mundo de Rails, muchas de las cosas comunes como las validaciones son manejadas por el framework.No es necesario comprobar la presencia en el conjunto params, sino que llama al validates_presence_of en el modelo y deja que Rails escupita el error al usuario. Hace las cosas más fáciles a largo plazo si dejas que el framework haga para lo que está diseñado.

Con respecto a su pregunta sobre la carpeta lib, en realidad no importa. Puede colocar varios archivos y bibliotecas de soporte en la carpeta lib en el directorio raíz y estarán disponibles para su uso en la aplicación (los archivos en la carpeta app). También puede optar por abstraer su código en un complemento o una gema e incluirlo de esa manera, que mucha gente opta por hacer. Mi sugerencia para esto sería leer sobre la noción de gemas y complementos antes de bucear.

+0

¡Gracias hornais, explicación muy útil! Tienes razón en que estoy acostumbrado a hacer muchas de estas cosas yo mismo en lugar de dejar que el Marco haga las cosas en común. Tiene sentido que los rieles hagan esto por ti, solo tengo que acostumbrarme. Intentaré validar la entrada en el nivel del modelo. – Naatan

1

lo que desea es probablemente un validador personalizado (en Rails3):

http://railscasts.com/episodes/211-validations-in-rails-3

Usted puede agregar una carpeta libs en lib se crea, o añadirlos a config/initializers en un archivo se agrega. Los archivos en el directorio initializers son cargados automáticamente por Rails.

Cuestiones relacionadas