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 permisos de parámetros de Rails no funcionan para múltiples casillas de verificación y selección múltiple.

Creando una nueva entrada para el modelo Associate que tiene book_id y tag_id. Mi requisito es tener una lista de casillas de verificación para los libros y una selección múltiple para las etiquetas, lo he hecho de la siguiente manera:

<%= form.collection_check_boxes(:book_id, books_hash, :last, :first) do |b| %>
  
<%= b.check_box class: 'form-check-input' %> <%= b.label class: 'form-check-label' %>
<% end %>
<%= form.label :tag_id %> <%= form.select :tag_id, options_for_select(Tag.pluck(:title,:id)), {}, {:multiple => true, :class => "chzn-select" } %>

Los parámetros permitidos son los siguientes:

params.require(:book_tag).permit(book_id: [], tag_id: [])

Pero el problema es que cuando guardo el registro, me muestra un error:

ActiveRecord::RecordInvalid (La validación falló: Book debe existir, Tag debe existir):

Procesando por BookTagsController#create como HTML
Parámetros: {"authenticity_token"=>"[FILTRADO]", "book_tag"=>{"book_id"=>["5"], "tag_id"=>["2", "3", "4"]}, "commit"=>"Create Book tag"}

No entiendo exactamente qué me falta.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está en la validación de los modelos Book y Tag. El mensaje de error indica que el registro no se puede guardar porque los objetos Book y Tag no existen.

    Debes asegurarte de que los objetos Book y Tag se creen antes de intentar crear un nuevo registro con sus respectivos IDs. Puedes hacer esto verificando si los IDs proporcionados en el parámetro book_tag corresponden a objetos Book y Tag válidos utilizando el método find, y luego asignar esos objetos a las variables book y tag, respectivamente.

    Aquí tienes un ejemplo de cómo podrías modificar tu acción create en el controlador para incluir esta lógica:

    def create
      @book_tag = BookTag.new(book_tag_params)
    
      # Asegúrate de que los objetos Book y Tag existan antes de crear un nuevo registro
      book = Book.find(params[:book_tag][:book_id])
      tag = Tag.find(params[:book_tag][:tag_id])
      @book_tag.book = book
      @book_tag.tag = tag
    
      if @book_tag.save
        redirect_to @book_tag
      else
        render 'new'
      end
    end
    

    Ten en cuenta que también debes actualizar tu método book_tag_params para permitir los parámetros book_id y tag_id:

    def book_tag_params
      params.require(:book_tag).permit(:book_id, :tag_id)
    end
    

    ¡Espero que esto ayude a resolver el problema!

Comments are closed.