Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Autenticación: lógica de update, delete y create del controlador de blogposts

24/33
Recursos

Aportes 7

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

En PostsController.rb:24 se escribió mal “Current.user.id” en el cursor aparece “Curen.user.id”…

El regex propuesto aquí acepta cadenas que inician con cualquier texto:
Ejemplo:

'xyzBearer z'.match(token_regex) # hace match

Esto se puede evitar validando el inicio y fin de cadena:

new_token_regex = /^Bearer (\w+)$/

¿El método “finb_by_auth_token” de User está definido?

HashWithIndifferentAccess

Este es un muy buen articulo sobre “HashWithIndifferentAccess”

Que la magia que hace es convertir cualquier clave en formato “símbolo” en una cadena para luego poder acceder a la informacion que estamos solicitando.

Conceptos extraídos de:

me salen 4 errores y no 3 como en el video

private_posts_spec.rb

require "rails_helper"

RSpec.describe "Posts with Authentication", type: :request do
  let!(:user) { create(:user) }
  let!(:other_user) { create(:user) }
  let!(:user_post) { create(:post, user_id: user.id) }
  let!(:other_user_post) { create(:post, user_id: other_user.id, published: true) }
  let!(:other_user_post_draft) { create(:post, user_id: other_user.id, published: false) }
  let!(:auth_headers) { { 'Authorization' => "Bearer #{user.auth.token}" } }
  let!(:other_auth_headers) { { 'Authorization' => "Bearer #{other_user.auth.token}" } }

  describe "GET /posts/{id}" do
    context 'with valid auth' do
      context 'when requisting others author post' do
        context "when post is public" do
          before {get "/posts/#{other_user_post.id}", headers: auth_headers }

            context "payload" do
              subject { payload }
              it { is_expected.to include(:id) }
            end
            context "response" do
            subject { response }
            it { is_expected.to have_http_status(:ok) }
            end
        end
        context "when post is draft" do
          before {get "/posts/#{other_user_post_draft.id}", headers: auth_headers }

            context "payload draft" do
              subject { payload }
              it { is_expected.to include(:error) }
            end
            context "response draft" do
            subject { response }
            it { is_expected.to have_http_status(:not_found) }
            end
          end
      end
      context 'when requisting users post' do
        
      end
    end 
  end
  describe "POST /posts" do

  end
  describe "PUT /posts" do

  end
      # it "should return OK" do
      #   get '/posts'
      #  payload = JSON.parse(response.body)
      #  expect(payload).to be_empty
      #  expect(response).to have_http_status(200)
      # end

      private

      def payload
        JSON.parse(response.body).with_indifferent_access
      end
  end

controlller

class PostsController < ApplicationController
  before_action :authenticate_user!, only: [:create, :update]
#general exception
  rescue_from Exception do |e|
    render json:  { error: e.message }, status: :internal_error
  end

# exception handler
rescue_from ActiveRecord::RecordInvalid do |e|
  render json:  { error: e.message }, status: :unprocessable_entity
end
#GET /posts
def index
  @posts = Post.where(published: true)
  if !params[:search].nil? && params[:search].present?
    @posts = PostsSearchService.search(@posts, params[:search])
  end
  #includes other module like user that is relationated with posts, this made 1 query to the db 
  #solution n+1 query problem
  render json: @posts.includes(:user), status: :ok
end

#GET /posts/{id}
def show
  @post = Post.find(params[:id])
  if (@post.published? || (Current.user && @post.user_id == Current.user.id))
  render json: @post, status: :ok
  else 
    render json: { error: 'Not_Found' }, status: :not_found
  end
end

#POST /posts
def create
  @post = Current.user.posts.create!(create_params)
  render json: @post, status: :created
end

#PUT /posts/{id}
def update
  @post = Current.user.posts.find(params[:id])
  @post.update!(update_params)
  render json: @post, status: :ok
end

private

def create_params
  params.require(:post).permit(:title,:content,:published) 
end

def update_params
  params.require(:post).permit(:title,:content,:published) 
end

def authenticate_user!
  #Bearer 'token'
  token_regex = /Bearer (\W+)/
  #read HEADER de auth
  headers = request.headers
  #verificar que sea valido
  if ['Authorization'].present? && headers['Authorization'].match(token_regex)
    token = headers['Authorization'].match(token_regex)[1]
  #debemos verificar que el user corresponda a un user
    if (Current.user = User.find_by_auth_token(token))
        return
  end
end
render json: { error: 'unauthorized'}, status: :unauthorized
end

end

Pero no me pasan las pruebas

Por un descuido escribo mal la relación en el modelo y me sucedió lo siguiente, acá la explicación:

Como nombras en rails variables, relaciones o nombres de archivos es importante tener claro como lo haces incluso hay palabras clave que no se deberían usar para nombrar variables. Me sucedió lo siguiente con el nombre de una relación:

// models/user.rb

has_many :post

Es valido para rails a pesar que un usuario tiene muchos post, la forma correcta debería ser

 has_many :posts // en plural

Esto es un problema cuando desde el controlador quieres hacer algo como:

@post = Current.user.post.create!(create_params)

Esto lo permite el lenguaje pero no es correcto hacerlo ya que la relación es 1:N

El debug no fue muy claro, hay otra forma de encontrar el error?