es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Los parámetros json PUT de Ruby on Rails 6 no están configurados.

Tengo un controlador muy simple de Rails 6 llamado BlogsController, con una acción de ACTUALIZACIÓN llamada actualizar. Cuando trato de enviar json usando postman, devuelve un error 400 Bad Request, en los registros encuentro que solo hay UN parámetro ??? de id, se ignora mi contenido json. Esto es algo muy básico que debería funcionar y no lo hace. Me confunde. Por favor, ayúdame.

Este es el código del controlador:

class BlogsController < ApplicationController
skip_before_action :verify_authenticity_token
before_action :set_blog, only: %i[ show edit update destroy ]

# GET /blogs or /blogs.json
def index
@blogs = Blog.all
end

# GET /blogs/1 or /blogs/1.json
def show
end

# GET /blogs/new
def new
@blog = Blog.new
end

# GET /blogs/1/edit
def edit
end

# POST /blogs or /blogs.json
def create
@blog = Blog.new(blog_params)

respond_to do |format|
  if @blog.save
    format.html { redirect_to @blog, notice: &quot;Blog creado correctamente" }
    format.json { render :show, status: :created, location: @blog }
  else
    format.html { render :new, status: :unprocessable_entity }
    format.json { render json: @blog.errors, status: :unprocessable_entity }
  end
end

end

# PATCH/PUT /blogs/1 or /blogs/1.json
def update
respond_to do |format|
if @blog.update(blog_params)
format.html { redirect_to @blog, notice: "Blog actualizado correctamente” }
format.json { render :show, status: :ok, location: @blog }
else
format.html { render :edit, status: :unprocessable_entity }
format.json { render json: @blog.errors, status: :unprocessable_entity }
end
end
end

# DELETE /blogs/1 or /blogs/1.json
def destroy
@blog.destroy
respond_to do |format|
format.html { redirect_to blogs_url, notice: "Blog eliminado correctamente” }
format.json { head :no_content }
end
end

private
# Use callbacks to share common setup or constraints between actions.
def set_blog
@blog = Blog.find(params[:id])
end

# Only allow a list of trusted parameters through.
def blog_params
  params.require(:blog).permit(:title, :content)
end

end

Hago PUT json a /blogs/1 con el encabezado Content-Type establecido en application/json

Content-Type: application/json

El elemento a actualizar se ve así:

{ "blog": {"id":1,"title":"Blog uno","content":"Blog 1 Test sem"} }

El mensaje de error en los registros se ve así:

2 [2] Iniciado PUT “/blogs/1″ por 54.86.50.139 en 2021-12-02 10:38:14 +0000
2 [2] Procesando por BlogsController#update como JSON
2 [2] Parámetros: {"id"=>"1"}
2 heroku[router]: at=info method=PUT path=”/blogs/1″ host=ror-backend-angular-13.herokuapp.com request_id=2f1982a8-bbe1-41b0-bb3c-09b7e3db7caa fwd=”54.86.50.139” dyno=web.1 connect=0ms service=7ms status=400 bytes=223 protocol=https
2 [2] Completado 400 Bad Request en 3ms (ActiveRecord: 0.9ms | Asignaciones: 441)
2 FATAL — : [2]
2 [2] ActionController::ParameterMissing (el parámetro falta o el valor está vacío: blog):
2: ¿Querías decir? acción
2: controlador
2: id):
2: [2]
2: [2] app/controllers/blogs_controller.rb:68:in blog_params&#39;
2 [2] app/controllers/blogs_controller.rb:41:in
block in update'
2 [2] app/controllers/blogs_controller.rb:40:in `update'

Como puede ver en los registros, solo hay un parámetro analizado: {"id"=>"1"}. ¿Por qué se ignora el cuerpo de contenido JSON? Esto es completamente loco, me está matando.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Basándonos en el mensaje de error en los registros, parece que el método blog_params espera que exista un parámetro llamado blog en la carga JSON, pero no lo está encontrando.

    Para solucionar este problema, asegúrese de que la carga JSON enviada a través de Postman incluya un parámetro llamado blog, de la siguiente manera:

    {
      "blog": {
        "id": 1,
        "title": "Blog uno",
        "content": "Blog 1 Test Sem"
      }
    }
    

    Esto debería permitir que la acción update interprete correctamente la carga JSON y actualice la publicación del blog correspondiente.

Comments are closed.