No tienes acceso a esta clase

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

Aprende todo un fin de semana sin pagar una suscripci贸n 馃敟

Aprende todo un fin de semana sin pagar una suscripci贸n 馃敟

Reg铆strate

Comienza en:

1D
14H
37M
10S

Manipular el patr贸n MVC

9/36
Recursos

Aportes 54

Preguntas 0

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

Manipular el patr贸n MVC


Para generar o abordar cierto tipo de informaci贸n de forma r谩pida, escribimos el comando:

rails g *model Nombre atributo1:string atributo2:string*

馃拵 El comando rails g nos permitir谩 generar estructuras predise帽adas y le vamos a pasar qu茅 tipo estructura queremos generar y el nombre de la estructura. Luego vamos a introducir los atributos junto a su tipo de dato.

Cuando ejecutemos este comando se van a generar dos archivos, uno es un archivo de la tabla que creamos para la DB y el otro es del modelo.

Este es el archivo que creo en el modelo, como podemos ver est谩 heredando de una clase que se llama ApplicationRecord, la cual se encarga de indicarle a Rails que la clase hija se trata de un modelo.

# pet.rb
class Pet < ApplicationRecord
end

En la carpeta db 鈫 migrate se encuentra el archivo que contiene la tabla que creamos para la base de datos.

# 7274580843_create_pets.rb

class CreatePets < ActiveRecord::Migration[6.0]
  def change
    create_table :pets do |t|
      t.string :name
      t.string :breed

      t.timestamps
    end
  end
end

Para pasar informaci贸n desde Rails a las vistas, para esto debemos cambiar la extensi贸n de nuestro archivo html a uno que le indique que dentro se va renderizar c贸digo Ruby.

# hello.html.erb

Si quieres a帽adir el contenido de una variable de ruby debemos utilizar:

Hola <%= @nombre %>

Recuerda que despu茅s de generar el modelo debemos escribir este comando para que termine el proceso.

rails db:migrate

Con el siguiente comando vamos a poder entrar a un contexto de interacci贸n din谩mica con la cual podemos crear una instancia nueva y que est谩 se guarde en la DB.

rails console

Para introducir un nuevo registro en la DB vamos a poner lo siguiente:

Pet.create name: 'Arnold', bread: 'poodle'

Mi soluci贸n:

Si no se indica el tipo de dato en la consola cuando se est谩 ejecutando la generaci贸n del modelo, por defecto su tipo de dato es 鈥渟tring鈥

Escribi una forma de mostrar una tabla con la informaci贸n de las mascotas que tenemos y si no hay mascotas mostrar un mensaje. Para esto en el controlador deben agregar:

<class HolaController < ApplicationController

    def welcome

        @Pets = Pet.all

    end
end
>

Y en la vista de welcome:

<<br> </br>

<%if @Pets.blank? %>
    <strong> THERE ARE NO PETS </strong>
<%else%>
    <storng> Your peths ! </strong><br></br>
    <table>
            <tr>
                <th>Name</th>
                <th>Breed</th>
            </tr>
            <% @Pets.each do |pet| %>
            <tr>
                <td><%= pet.name %></td>
                <td><%= pet.breed %></td>
            </tr>
        <% end %>
    </table>
<%end%>>

Introducci贸n de Model

En este caso se usar谩n objetos que representen una mascota, con los atributos nombre y raza. Los objetos creados ser谩n guardados en una base de datos, donde las columnas son los atributos y las filas los registros.

Para generar informaci贸n de forma r谩pida Rails nos provee del comando rails g (rails generate), este comando permite utilizar estructuras predise帽adas para generar el model.

rails g <estructura> <nombre>:<tipo> <atributos>:<tipo>
rails g model Pet name breed:string breed:string

Cuando se ejecuta este comando se crean dos archivos, uno dentro de la carpeta db>migrate que en su nombre tiene una marca de tiempo seguido de create y el nombre del model que se cre贸. Y el otro archivo dentro de la carpeta app>models llamado como el modelo (pet.rb).

Al abrir el archivo pet.rb, se observa que se creo una clase llamada Pet, que hereda de ApplicationRecord, de esta forma se le indica a Rails que se trata de un model.

Por otro lado, el archivo creado en db>migrate contiene una clase llamada CreatePets, que le indica al sistema que se esta creando una tabla llamada Pets que interact煤a directamente con la base de datos

Se podr铆a decir que el concepto de Model est谩 dentro del mundo de Ruby, y por otra parte se encuentra la base de datos. Dentro del archivo pet.rb se aprecia el concepto de model y dentro del archivo en db>migrate se aprecia el concepto de la base de datos.

Lo que se est谩 haciendo con estos archivos es una equivalencia del mundo de Ruby, con un mapeo de la clase pet, a el mundo de la base de datos, creando una tabla llamada pets.


Acceder a la informaci贸n

Para pasar informaci贸n desde un model hac铆a una vista se utiliza un nuevo concepto, llamado variable de instancia.

Para definir una variable de instancia se utiliza el @ seguido del nombre.

@variable = 'Hello world'

Para pasar esta variable creada en el controlador, hac铆a una vista se debe utilizar una convenci贸n espec铆fica para poder pasar la informaci贸n desde el controlador a la vista.

Esta convenci贸n es que la vista debe tener la extensi贸n erb pero a帽adi茅ndolo despues de la extensi贸n HTML, de esta forma se le indica a Rails que dentro se va a renderizar c贸digo Ruby.

hello.html.erb

De esta forma se le indica al sistema que antes de renderizar el html se tiene que renderizar c贸digo Ruby.

Para acceder a la variable de instancia desde la vista ya con la extensi贸n erb se utiliza la siguiente convenci贸n:

<%= @variable %>

Pero al hacer esto Rails nos lanza un error al abrir la aplicaci贸n en el navegador, este error es a causa de la equivalencia entre el objeto Pet y la tabla de la base de datos. Para resolverlo hay que ejecutar el comando rails db:migrate.

Una vez hecha la migraci贸n, ya se podr谩n visualizar las variables de instancia en la vista.

Crear registros con Rails console

Rails nos provee con un ORM llamado Active Recorder para manipular la base de datos. Para hacer uso de este ORM y crear registros en la tabla (o hacer otra operaci贸n en la BD) hay que entrar a la consola de Rails desde la terminal con el comando rails console.

Despu茅s se utiliza el siguiente comando para crear registros en la tabla que definimos:

=> Pet.create name: "doggy", breed: "poodle"

Cuando se ejecuta autom谩ticamente se crea y se ejecuta la sentencia SQL correspondiente para el registro que se indic贸.

El registro que crea tiene los campos que le asignamos en el modelo y adem谩s el campo created_at, con la fecha y hora en que fue creado el registro y el campo updated_at, con la fecha y hora de la ultima vez que se actualiz贸 el registro.

Consultar un registro

Utilizando la clase Pet y el m茅todo first podemos consultar el primer registro de la tabla.

=> Pet.first

Usando este m茅todo podemos presentar la informaci贸n en la vista, dandole el valor a una variable de instancia.

Active Recorder

Este ORM usado por Rails tiene otros m茅todos que considero importantes mencionar. En los ejemplos se usa el model User con los atributos name y ocuppation.

Create:

  • User.create name:"David", occupation: "Code Artist": El m茅todo create, crea y guarda un nuevo registro en la base de datos
  • User.new: Se instancia un nuevo objeto pero sin guardarse en la base de datos. Los valores a los atributos se pueden asignar luego de crearlo. P.E. user.name = "David" , user.occupation = "Code Artist". Para guardar este registro en la base de datos ejecuta el comando user.save.

Read:

  • User.all: Devuelve todos los usuarios.
  • User.first: Devuelve el primer usuario.
  • User.find_by(name: 'David'): Devuelve el primer usuario con el valor buscado. Dentro de los par茅ntesis puede ir cualquier atributo del objeto.
  • User.where(name: 'David', occupation: 'Code Artist'): Devuelve todos los usuarios con los valores buscados.

Update:

Cuando Active Recorder devuelve un objeto, los atributos de este pueden ser modificados y guardados en la base de datos. P.E:

user = User.find_by(name: 'David')
user.name = 'Luis'
user.save

Una forma m谩s corta de hacerlo es con el m茅tod update:

user = User.find_by(name: 'David')
user.update(name: 'Luis')

Si se quieren cambiar los valores de todos los registros de la tabla:

User.update_all "name = 'Luis', occupation = 'Code Artist'"

Delete

Para eliminar un registro de la base de datos:

user = User.find_by(name: 'David)
user.destroy

Eliminar varios registros a la vez:

# elimina todos los usuarios con el valor dado
User.destroy_by(name: 'David) 
  • User.destroy_all: Elimina todos los registros de usuarios.

As铆 qued贸 mi codigo.

class WelcomeController < ApplicationController
    def hello
        @pet_name = Pet.first.name
        @pet_breed = Pet.first.breed
    end
end
Hola, mi nombre es: <%= @pet_name %> y soy de raza: <%= @pet_breed %>```

Existe alguna gema que me permita usar templates de generadores para modelos t铆picos o com煤nmente usados?

Mi forma de hacer la soluci贸n.

En el controlador

class WelcomeController < ApplicationController
def hello
name = Pet.first.name
breed = Pet.first.breed
@variable = "Hola soy #{name}, y soy un #{breed}"
end
end

En el .html.erb

<%= @variable %>

Creaci贸n de un objeto
El comando rails g permite utlilizar ciertas estructras de codigo predise帽adas para empezar a abordar cierto tipo de informaci贸n m谩s r谩pido. Le agregamos un par谩metro que en este caso ser谩 model. El nombre del modelo ser谩 Pet (mascota). Tambi茅n le agregamos sus atributos junto con el tipo de dato: name, breed. Ambos son strings.

rails g model Pet name:string breed:string

Esto generar谩 dos archivos: db/migrate y pet.rb.
El archivo pet.rb ser谩 una clase (Pet) heredada de ApplicationRecord. Este es el modelo.
_
La carpeta db/migrate contendr谩 un archivo create_pets. Tambi茅n ser谩 una clase que crea una clase llamada pet que interact煤a con la base de datos. Este es el concepto de base de datos.
_
La convenci贸n de nombres debe ser la misma
_
Variable de instancia
Sirven para pasar informaci贸n de Rails a las vistas. Se inicializan con @ seguido de su nombre y contenido a asignar.

@variable = 'Hello world'

Para renderizar c贸digo Ruby en un archivo HTML debemos cambiar su extensi贸n a name.html.erb. erb denota que antes de renderizar HTML renderiza c贸digo Ruby.
_
En este archivo ahora podremos usar las etiquetas <%= %> para renderizar el contenido de la variable antes creada.
_
En caso de presentarse un error de migraci贸n solo hay que correr el comando rails db:migrate en el cmd.
_
Crear registro en la base de datos
Vamos a la consola y ejecutamos rails console que nos permitir谩 una interacci贸n din谩mica con todos los registros creados en Rails, incluyendo modelos.
Para crear un registro en la DB usamos el nombre de la clase seguido del m茅todo .create, luego los atributos separados por comas.

Pet.create name:'Jack', breed:'Schnauzer'

Podemos acceder al registro en nuestra variable asignandole el nombre de la clase, seguido de .first. Tambi茅n podemos a帽adir el sufijo de alg煤n atributo si se quiere ser m谩s especifico.

@variable = Pet.first.name # Imprime Jack

Buen d铆a compa帽eros y docente, espero me pueden ayudar, trate de googler mi problema pero no doy o no entiendo como solucionar esto:
en el min 10 el profe habla de entrar a console para ingresar datos, ingreso los mismos que menciona y me marca lo siguiente.

Traceback (most recent call last):
        1: from (irb):1
NameError (uninitialized constant Pet)
Did you mean?  Net
               Set

Agradeceria su ayuda.

MVC, MVC unos de los mas usado

mi controlador

---  welcome_controller.rb ---
class WelcomeController < ApplicationController
  def hello
    @name = Pet.first.name
    @breed =  Pet.first.breed
  end
end

--- hello.html.erb ---
<%= "隆Hola soy #{@name} y soy un #{@breed}!" %>

Controller

class WelcomeController < ApplicationController
    
    def hello
        @variable = Pet.first();
    end
    
end

View

<p>Hola soy <%= @variable.name %> y soy un <%= @variable.breed %></p>

En la clase Pet

class Pet < ApplicationRecord

	def self.introduce
        name = %Q(Hello!! I'm #{Pet.name} and I'm a #{Pet.breed})
  end
end

En el controlador

class WelcomeController < ApplicationController
    def hello
        @credentials = Rails.application.credentials.hello
        @variable = Pet.first.introduce
    end
end

En la vista

<%= @variable %>

As铆 busco e imprimo otros registros que son distintos al primero.

class WelcomeController < ApplicationController
  def hello
    pet = Pet.find { |r| r.id == 3 }
    @variable = pet.name
  end
end

mi solucion al reto:

class WelcomeController < ApplicationController
  def hello
    @variable = "Hola soy #{ Pet.first.name } y soy de raza #{ Pet.first.breed }"
  end
end
class WelcomeController < ApplicationController
  def hello
    @name_pet = Pet.first.name
    @breed_pet = Pet.first.breed
  end
end
<h2>Hola soy <%= @name_pet %> y soy de raza <%= @breed_pet %></h2>  
class WelcomeController < ApplicationController
  def hello
    @pet_name = Pet.first.name
    @pet_breed = Pet.first.breed
  end
end
<p>Hola soy <%= @pet_name%> y soy de raza <%= @pet_breed%></p>

Creo que todos pudimos, este fue mi proceso

Esta ser铆a mi propuesta para saludar

<
class WelcomeController < ApplicationController 
  def hello 
    @saludar  = 'Hola, soy ',Pet.second.name,' y soy una gata ',Pet.second.breed
  end
end
> 

Hola a todos.

Un tip de algo que vi, para tener en cuenta:

  • En caso de que deseen generar un modelo cuyos atributos sean solo de tipo string, pueden obviar el formato nombre:tipo y solo indicar el nombre del atributo:

rails g model Pet name breed

Para confirmar, pueden digitar 鈥榬ails console鈥 y les va a cambiar el dise帽o del terminal tipo IRB (Interactive Ruby, en el caso de Windows como lo he manejado) y escriben Pets.columns; les aparecer谩 la estructura de los campos creados y el tipo de cada uno.

  • En Rails, una forma de guiarse f谩cilmente al crear controladores y modelos asociados es que el controlador tiene nombre declarado en plural, mientras que el modelo est谩 nombrado en singular (aunque para el tutorial se hizo una excepci贸n particular con WelcomeController; no digo que sea obligatorio, pero es una convenci贸n general)

Son mis consideraciones al respecto seg煤n he visto. Espero puedan ser de utilidad.

Para resolver el ejerci贸 en el archivo welcome_controller use dos variables de instancia:

class WelcomeController < ApplicationController
    def hello
        @name = Pet.first.name
        @breed =Pet.first.breed
    end
end

y en el archivo Hello :

hola soy : <%= @name%>  y mi raza es : <%= @breed%>

Mi aporte:

class WelcomeController < ApplicationController
    #Los nombre con mayuscular
    def hello
        #Crear una variable distancia
        # @variable = '驴Como estas?'
        @name = Pet.first.name
        @breed = Pet.first.breed
    end
    
end

Y en el html

<h1>BIENBENIDO</h1>
    <p>Soy <%= @name%> y soy un gato <%= @breed%> </p>

Mi soluci贸n al reto:

class WelcomeController < ApplicationController

  def hello
    @name = Pet.first.name
    @breed = Pet.first.breed
  end

end
<h2>隆Hola! Me llamo <%= @name %> y soy un <%= @breed %> </h2>

<h1> Hola mi nombre es <%= @variable.name %> y soy un <%= @variable.breed %> </h1>

La diferencia entre <%= %> y <% %> es que la primera despliega la informaci贸n dentro de esta mientras que la segunda solo ejecuta el c贸digo incrustado.

Super bien explicado!

que buen curso 馃槂
<h1>como estas?<h1/>
<h1><%= @nombre %> tu eres un <%= @raza %><h1/>

Mi controller es:

<h3></h3>
def hello#porque en el controlador esta welcome#hello
    @nombre_mascota = Pet.first.name
    @raza_mascota = Pet.first.breed   
end
<h3></h3>

Mi vista es:

<h3></h3>

<br>
Hola soy
<%= @nombre_mascota %>
de raza
<%= @raza_mascota %>

<h3></h3>
class WelcomeController < ApplicationController
    def hello 
        pet= Pet.first
        @name=pet.name
        @breed=pet.breed
    end
end```


<h1>Hola mi nombre es <%[email protected]%> y soy un <%[email protected]%></h1>```

Controller

class WelcomeController < ApplicationController
    def hello
        @pet = Pet.first
    end
end```

**View**


<p>Hola soy <%= @pet.name%> y soy un <%= @pet.breed %></p>```

Mi soluci贸n:

class WelcomeController < ApplicationController
    def hello
        @variable = Pet.first
    end
end
<p>
    Hola soy <%= @variable.name %> y soy un <%= @variable.breed %>  
</p>

Aqui mi cambio 馃槂

Interesante repl de Rails

Una alternativa, pasar solo la variable y utilizar sus atributos en la vista

class PetController < ApplicationController
	def hello
		$pet = Pet.first
	end
end
Hola, soy <%= $pet.name %> y soy un <%= $pet.breed %>

Mi soluci贸n:

class WelcomeController < ApplicationController
  def hello
    pet = Pet.first
    @name = pet.name
    @breed = pet.breed
  end
end

Y

<h3>Hola, soy <%= @name %> y soy un <%= @breed %> </h3>```
<h1>Ejercicio resuelto</h1>

1. Cambi茅 el nombre de la variable seg煤n correspond铆a a name.

2. Cre茅 una nueva variable para almacenar la informaci贸n de la raza.

3. Coloqu茅 las variables dentro de una etiqueta de p谩rrafo, agregando el texto solicitado en el ejercicio.

4. Este ser铆a el resultado en la vista:

Hola este es mi c贸digo:

Mi controlador:

class WelcomeController < ApplicationController
  def hello
    @variable_name = Pet.first.name
    @variable_breed = Pet.first.breed
  end
end

Mi vista:

<h3>Hola, soy un <%= @variable_name %> y soy un <%= @variable_breed %> </h3>

La tarea puede ser delegada tanto en la vista como en el controlador, en este sentido @variable contiene el objeto completo Pet, y desde la vista se puede acceder a sus atributos de igual forma que se puede hacer en el controlador, esta es otra posible soluci贸n:

welcome_controller.rb

class WelcomeController < ApplicationController
  def hello
    @varible = Pet.first
  end
end

hello.html.erb

Hola, mi nombre es <%= @varible.name %> y soy de raza <%= @varible.breed %>

Sin embargo se debe tener en cuenta que no siempre se encuentra un registro en la base de datos y por ende el valor podr铆a ser nil, si esto llegase a ocurrir, el acceso mediante notaci贸n de puntos no seria v谩lido ya que el objeto NIL no tiene como atributo .name, ni tampoco .breed, esto generar铆a un error en el reenderizado del archivo hello.html.erb

Aqu铆 esta mi soluci贸n:

.html.erb

<p>
  Hola! soy 
  <%= @firstPet.name %>
  y soy un <%= @firstPet.breed %>
</p>

controller.rb

class WelcomeController < ApplicationController
  def hello
    # comments
    @firstPet = Pet.first
  end
end

Saludos

Mi soluci贸n es la siguiente:

# welcome_controller.rb
class WelcomeController < ApplicationController
  def hello
    @pet = Pet.first
  end
end
<!-- hello.html.erb -->
Hola, soy <%= @pet.name %> y soy un <%= @pet.breed %>

Cabe destacar que cuando se quiere mostrar informaci贸n renderizado en ruby se utiliza la etiqueta <%= %> . Ahora si no lo quisiera mostrar, como por ejemplo si fuese a usar ciclos en ruby, no le agrego el signo de igualdad 鈥=鈥

Ac谩 est谩 mi aporte鈥

Welcome Controller

class WelcomeController < ApplicationController
  def Home
    @saludo = "Hola amigos"
    my_pet = Pet.first
    @name = my_pet.name
    @breed = my_pet.breed
  end
end

Vista Home

<h1> <%= @saludo %> </h1>

<p> Hola soy <%= @name %> y mi raza es <%= @breed %> </p>

def hello
	@pet = Pet.last
end
<p> Hola soy <%= @pet.name%> y soy un <%= @pet.breed %>

En el controlador defino dos variables.
def hello @nombreMascota = Pet.first.name @razaMascota = Pet.first.breed end

en mi archivo html las invoco:
Hola, soy <%= @nombreMascota %> y son de la raza <%= @razaMascota %>

Unos de los profesores que mejor explican al momento de introducir codigo. que bueno encontrar instructores asi, gracias Johan Tique.

No s茅 que est谩 pasando con la migraci贸n. He seguido paso a paso y cuando quiero insertar un registro me que la variable Pet no ha sido inicializada. Estoy haci茅ndolo con postgresql

Mi controlador:

class WelcomeController < ApplicationController
  def hello
    @hello_pet =  "hello I'm #{Pet.first.name} and this is my breed: #{Pet.first.breed}"
  end
end

Hello.html.erb

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <%= @hello_pet%>
  </body>
</html>