Los callbacks son metodos que son llamados en algun momento del ciclo de vida de un objeto(creado-actualizado-eliminado), en este caso vamos a utizarlos para hacer varias validaciones antes realizar algunas acciones con metodos que ya rails y devise tienen para nosotros pero tambi茅n podemos hacer callbacks con metodos creados por nosotros mismos dentro de la clase.
Asi que continuando con nuestra aplicaci贸n de notas vamos a aplicarlo.
En el controlador de notas
before_action :authenticate_user!, except: [:index, :show] #Antes de cualquier acci贸n en el controlador verificamos si el usuario esta autenticado utilizando en metodo authenticate_user! de devise exepto para index y show
Ahora en el modelo聽
validates :title, presence: true, uniqueness: true #Validamos que en los campos all谩 contenido y que el titulo sea 煤nico
validates :body, presence: true
Ahora vamos a crear nuestros metodos metodos para editar y eliminar,聽 tambi茅n modificamos el metodo create en nuestro controlador para agregar al usuario autor de la nota
#post /notes
def create
@note = current_user.notes.new(title: params[:note][:title], body: params[:note][:body]) #Put current user at foreign key
if @note.save()
redirect_to @note
else
render :new #use new view with this variable class
end
end
#delete /notes/:id
def destroy
@note = Note.find(params[:id])
@note.destroy #delete object of db
redirect_to notes_path
end
#get /notes/:id/edit
def edit
@note = Note.find(title: params[:note][:title], body: params[:note][:body])
end
#put /notes/:id/update
def update
@note = Note.find(params[:id])
if @note.update(params[:title, :body])
redirect_to @note
else
render :edit
end
end
Vamos a index dentro de nuestras vista de las notas y agregamos las opciones para editar y eliminar mas la condici贸n que solo permite al autor de la nota poder eliminarla o editarla
<% if current_user && current_user == note.user %>
<span><%= link_to "Eliminar", note, method: :delete %></span>
<span><%= link_to "Editar", edit_note_path(note)%></span>
<% end %>
Ahora para la vista que necesitamos para editar nuestras notas vamos a reutilizar el formulario que ya tenemos para crearlas as铆 que lo primero que vamos hacer es crear un nuevo partial llamado notes_form y vamos a pegar aqu铆 el formulario que ya teniamos, y en nuestros archivos new y edit vamos a renderizarlo y le vamos a pasar el nombre de la funcion como parametro asi:
En el partials
<div class="form col-md-10">
<h1><%= name %> nota</h1>
<%= form_for(@note) do |f|%>
<div class="field">
<%=f.text_field :title, placeholder: "Titulo", class:"form-control data-title"%>
</div>
<div class="field">
<%=f.text_field :body %>
</div>
<div class="field">
<%=f.submit "guardar", class:"btn be-red white"%>
</div>
<%end%>
</div>
En new y edit
<%= render "partials/article_form", {name: "Crear"}%> #Cambia la variable segun el archivo
Ya solo nos queda probar estas nuevas funcionalidades y con esto hemos terminado nuestra aplicacion de notas en rails.... Bueno tal vez no tanto,
hay algo que todav铆a no funciona muy bien, en este momento cualquier usuario pueder ver las notas de todos los usuarios que esten dentro de nuestra app y pues no creo que queramos eso, asi que hay dos variantes para solucionar este problema que te pueden ayudar a practicar lo que has visto hoy he ir un poco mas all谩...
1. Hacer que cada usuario pueda ver solo sus propias notas.
2. Que nuestra app funcione como una herramienta colaborativa en la cual, dentro de un grupo de usuarios puedan postear notas y hacer comentarios.
Puedes hacer fork del repositorio en GitHub donde se encuentra el proyecto que hemos creado y empezar a trabajar sobre el.
repo:
https://github.com/sloaizac/notes-app-rails-exampleAgrege algunos estilos en app/assets/stylesheets, puedes agregar tus propios estilos o mejorarlos