No guarda datos del collecion_select


#1

Estimados

Les comento que tengo un formulario donde tengo lo siguiente

Articulo tienen una categoria
Articulo tienen una familia

Al levantar la vista de Articulos todo bien y llamo a las categorias y las familas

Pero al momento de querer guardar el articulo, me dice que las familias y categorias debe existir

Y no arroja mensaje de error solo hace rollback y no guarda los datos

Alguna sugerencia que me puedan guiar

_form.html.erb

<%= form.collection_select :Familia_id, @familium, :id, :nombre,
{selected: @articulo.Familia_id, include_blank: ‘Seleccione Familia’},
{class: “form-control”} %>

<%= form.collection_select :Categoria_id, @categorium, :id, :nombre,
{selected: @articulo.Categoria_id, include_blank: ‘Seleccione Categoria’},
{class: “form-control”} %>

En el Articulo Controller agregue esto para la llamada

before_action :set_combo_values, only: [:new, :edit, :update, :create]


def set_combo_values
@categorium = Categorium.all.order(:nombre)
@familium = Familium.all.order(:nombre)
end

Eso

PD: probe guardar un articulo por consola y tampoco pude

Saludos


#2

Tienes bien establecidas las relaciones en el modelo?
Podrías mostrar el código de tu actiont ‘create’ y los parámetro que le llegan cuando lo llamas?


#3

class Articulo < ApplicationRecord
belongs_to :Categoria
belongs_to :Familia
validates :codigo, :nombre, presence: true
end

class Categorium < ApplicationRecord
has_many :Articulo
end


class Familia < ApplicationRecord
has_many :Articulo
end


en el Controller

def create
@articulo = Articulo.new(articulo_params)

respond_to do |format|
  if @articulo.save
    format.html { redirect_to @articulo, notice: 'Articulo was successfully created.' }
    format.json { render :show, status: :created, location: @articulo }
  else
    format.html { render :new }
    format.json { render json: @articulo.errors, status: :unprocessable_entity }
  end
end

end

def articulo_params
params.require(:articulo).permit(:codigo, :nombre, :descripcion, :stock_minimo, :stock_inicial, :categoria_id, :familia_id, :foto)
end


#4

Amigo veo algunas inconsistencias en los nombres de las clases y las relaciones por ejemplo la relación

belongs_to :Categoria
class Categorium < ApplicationRecord

también debes revisar el formulario y el controlador

<%= form.collection_select :Familia_id, @familium, :id, :nombre,
{selected: @articulo.Familia_id, include_blank: ‘Seleccione Familia’},
{class: “form-control”} %>

<%= form.collection_select :Categoria_id, @categorium, :id, :nombre,
{selected: @articulo.Categoria_id, include_blank: ‘Seleccione Categoria’},
{class: “form-control”} %>
# Controller
def articulo_params
params.require(:articulo).permit(:codigo, :nombre, :descripcion, :stock_minimo, :stock_inicial, :categoria_id, :familia_id, :foto)
end

en este caso debes revisar si estás teniendo problemas con el uso de mayúsculas y minúsculas, por eso te pedía que mostraras lo que trae cuando entras al ‘create’

params

#5

Creo que en eso tengo muchas dudas, el tema fue cuando asigno nombres en plural, voy a probar con un ejemplo simple y todo en miniscula para al menos descartar eso, aunque aun no lo comprendo muy bien pero voy a hacer un ejemplo pequeño

Muchas gracias de antemano y te aviso como me fue


#6

Tienes que revisar la documentación de Rails, sobre todo el principio de convención sobre configuración, que uno de los elementos que explica es su sugerencias de utilizar los nombres de las tablas en plurar, pero entonces el modelo debe ser el singular, te explico con tus categorías:

Creas una tabla categories

create_table :categories do |t|
 t.column :name, string, null: false
 ...
end

Entonces tendrías un modelo en singular para referenciar esa tabla

class Category < ApplicationRecord
  has_many :articles
 ...
end

class Article < ApplicationRecord
 belongs_to :category
 ...
end

De no usar estas convenciones del framework tienes que dejar explicacito en cada relación cual es el nombre de la case que se referencia, explicar el modelo a que table_name referencia también
Otra buena práctica que se recomienda es utilizar, los nombres de variables, clases y métodos o acciones en inglés.

Saludos


#7

Estimado arcangel8801

Agradezco su ayuda y apoyo tome al 100 tus sugerencias e hice un app de ejemplo y efectivamente solucione el tema

SI que muy agradecido y buen resto de semana

Slds


#8

Que bueno que solucionaste el tema, cualquier otra duda puedes preguntarme

Saludos