No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Agiliza la construcci贸n de formularios con Simple Form

15/36
Recursos

Aportes 16

Preguntas 7

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Reg铆strate o inicia sesi贸n para participar.

Si tienen algun problema instalando simple_form como:

Running via Spring preloader in process 33127
Could not find generator 'simple_form:install'. 
Run `rails generate --help` for more options.

Intenten apagando spring y prendiendolo

spring stop
spring start
rails generate simple_form:install

SIMPLEFORM

驴Qu茅 es?

  • Componente que agiliza la construcci贸n de los formularios
  • Es una Gema

Instalaci贸n:

  1. A帽adir: gem 鈥榮imple_form鈥 en el gemfile.
  2. Usar el comando bundle install (o bi)
  3. Correr el generador usando: rails generate simple_form:install en el CMD
    Este proceso generar谩 una preconfiguraci贸n del simple form usando plantillas.

Generar un form

  • Generaremos un scaffold para el modelo User como hemos visto anteriormente. En este caso usando los atributos first_name, last_name, address, about_me y phone.
  • Podemos ver que ahora, en las invocaciones, en lugar de erb, llamar谩 a HAML
  • Es posible a帽adirle cosas extra a los atributos creados. Por ejemplo, un label, que cambiar谩 el nombre que se muestra en el form de la p谩gina web. M谩s de esto se puede ver en la documentaci贸n de simple form.

Es posible hacer la conversi贸n de HTML a HAML usando la herramienta HTML2HAML

https://erb2slim.com/

En esta pagina se puede hacer el parseo de ERB a SLIM que es otro motor de templates, sin embargo tambien sirve para convertir a HAML

Mi archivo qued贸 diferente:

= form_for @user do |f|
  - if @user.errors.any?
    #error_explanation
      %h2= "#{pluralize(@user.errors.count, "error")} prohibited this user from being saved:"
      %ul
        - @user.errors.full_messages.each do |msg|
          %li= msg

  .field
    = f.label :first_name
    = f.text_field :first_name
  .field
    = f.label :last_name
    = f.text_field :last_name
  .field
    = f.label :address
    = f.text_field :address
  .field
    = f.label :about_me
    = f.text_area :about_me
  .field
    = f.label :phone
    = f.number_field :phone
  .actions
    = f.submit 'Save'

mi GemFile


gem 'bootsnap', '>= 1.4.2', require: false

gem 'hamlit'
gem "simple_form"

comando de terminal:

rails generate simple_form:install

Hice algo mal o es una nueva versi贸n?

La pagina: https://htmltohaml.com/ ya no existe.

el partial de _form de libros lo podr铆amos colocar en haml de la siguiente manera:

-# frozen_string_literal: true
= simple_form_for(@book) do |form|
  - if book.errors.any?
    #error_explanation
      %h2
        = pluralize(book.errors.count, "error")
        prohibited this book from being saved:
      %ul
        - book.errors.full_messages.each do |message|
          %li= message
  .field
    = form.label :title
    = form.text_field :title
  .field
    = form.label :author
    = form.text_field :author
  .field
    = form.label :description
    = form.text_area :description
  .field
    = form.label :isbn
    = form.text_field :isbn
  .field
    = form.label :pages_count
    = form.number_field :pages_count
  .actions
    = form.submit

Simple Form es una dependencia que ayuda con la creaci贸n de formulario manteniendo la estructura MVC.

Para instalar la gema hay que a帽adir gem 'simple-form' a la lista de dependencias en el Gemfile y despu茅s ejecutar el comando bundle install

Una vez instalado hay que ejecutar el comando rails g simple_form:install para que la dependencia se configure con una serie de plantillas y un inicializador.

Este comando crea tres archivos: el inicializador, que es una pre configuraci贸n de la librer铆a; el archivo de internacionalizaci贸n, y la plantilla del formulario que para generar los scaffolds utilizando haml.


Al crear un nuevo scaffold se aprecia que para la creaci贸n de las vistas ya no utiliz贸 erb, sino haml.

Al comparar las plantillas generadas con haml con las previamente generadas con erb, se observa que las de haml tienen una estructura mucho m谩s limpia y f谩cil de leer con muchas menos l铆neas de c贸digo.

Existen conversores de HAML a HTML, en caso de que usar la nueva sintaxis se dificulte.

Despu茅s de generar modelo User con scaffold se debe reiniciar el servidor de lo contrario (en mi caso) se muestra un error al entrar a /users/new:

undefined method `simple_form_for鈥 for #<#Class:0x00:0x000>
Did you mean? simple_format

Esta fue mi manera de solucionar el cambio de HTML/ERB a HAML:

= simple_form_for(@book) do |f|
  - if book.errors.any?
    #error_explanation
      %h2
        = pluralize(book.errors.count, "error")
        prohibited this book from being saved:
      %ul
        - book.errors.each do |error|
          %li= error.full_message

  .form-inputs
    = f.input :title, label: 'Titulo'
    = f.input :author, label: 'Autor'
    = f.input :description, label: 'Descripccion'
    = f.input :isbn, label: 'ID'
    = f.input :page_count, label: 'Cantidad de paginas'

  .form-actions
    = f.button :submit

Tuve que modificar una parte, para poder instalar Simple Form, en la siguiente direcci貌n: https://rubygems.org/gems/simple_form/version/5.1.0, hay un campo de nombre GEMFILE copiar el contenido y pegarlo en el GEMFILE

gem 鈥榮imple_form鈥, 鈥榽> 5.1鈥

al especificar la versi貌n ya me dejo instalarlo con.

bundle install

Gracias.

This is my code

-# frozen_string_literal: true
= simple_form_for(@book) do |f|
  = f.error_notification
  = f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present?

  .form-inputs
    = f.input :title
    = f.input :author
    = f.input :description
    = f.input :isbn
    = f.input :pages_count

  .form-actions
    = f.button :submit

As铆 qued贸 mi archivo: _form.html.haml

= simple_form_for(@book) do |f|
  = f.error_notification
  = f.error_notification message: f.object.erros[:base].to_sentence if f.object.errors[:base].present?

  .form-inputs
    = f.input :title
    = f.input :author
    = f.input :description
    = f.input :isbn
    = f.input :pages_count
  
  .form-actions
    = f.button :submit

As铆 quedo mi c贸digo:

= simple_form_for(@book) do |f|
  = f.error_notification 
  = f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present?

  .form-inputs 
    = f.input :title, label: 'Titulo'
    = f.input :author, label: 'Autor'
    = f.input :description, label: 'Descripci贸n'
    = f.input :isbn, label: 'Identificador'
    = f.input :pages_count, label: 'Paginas'
    
  .form-actions 
    = f.button :submit```

Aqu铆 dejo mi formulario de books con haml. Por cierto hay que tener cuidado con la identaci贸n como el profesor comento as铆 es como se separa.

= simple_form_for(@book) do |book|
  = book.error_notification
  = book.error_notification message: book.object.errors[:base].to_sentence if book.object.errors[:base].present?

  .form-inputs
    = book.input :title , label: "Titulo"
    = book.input :author, label: "Autor"
    = book.input :description , label: "Res煤men"
    = book.input :isbn , label: "isbn"
    = book.input :pages, label: "N p谩ginas"


  .form-actions
    = book.button :submit>

De igual manera cambie el archivo new.html.erb a new.html.haml de books que es donde se hace la renderizaci贸n al formulario.

%h1 New Book

= render 鈥榝orm鈥

= link_to 鈥楤ack鈥, books_path

Considero que HAML esta muy bien para paginas sencillas, pero seg煤n estuve buscando para ingresar otro atributos como aria attributes, se hace en una especie de JSON, que en los personal no me cuadra mucho como se ve. Cuestion de gustos supongo(?)

Con el comando:

bundle exec rake hamlit:erb2haml

Qued贸 as铆 books:

= form_with(model: book, local: true) do |form|
  - if book.errors.any?
    #error_explanation
      %h2
        = pluralize(book.errors.count, "error")
        prohibited this book from being saved:
      %ul
        - book.errors.full_messages.each do |message|
          %li= message
  .field
    = form.label :title
    = form.text_field :title
  .field
    = form.label :author
    = form.text_field :author
  .field
    = form.label :description
    = form.text_area :description
  .field
    = form.label :isbn
    = form.text_field :isbn
  .field
    = form.label :pages_count
    = form.number_field :pages_count
  .actions
    = form.submit