2
respostas

Como enviar uma lista de um objeto para um controller

Olá,

Estou brincando com as associações e fiz um relacionamento many to many em duas classes usuario e item:

class Usuario < ApplicationRecord
    has_many :inventory
    has_many :items, through: :inventory
end
class Item < ApplicationRecord
    has_many :inventory
    has_many :users, through: :inventory

A idea é ao cadatrar um usuário no banco já passar um array com alguns items que ele possui no estoque, mas não estou conseguindo...

No controller usei o metodo params permitindo alguns valores incluindo um array de items

def user_params
    params.permit(:name,:age,:gender,:items=>[:name,:quantity])        
end

Mas ao tentar cadastrar usuário a seguinte mensagem é exibida :

Unpermitted parameter: :items

E o usuário é adicionado ao banco se adicionar os items.

Como posso passar uma lista objetos para um controller?

2 respostas

Oi Willian, não sou um railer, mas vamos tentar. Em primeiro lugar, desculpe pela demora, nunca queremos que isso aconteça, mas de vez em quando alguma pergunta fica mais tempo. Estamos tentando sempre melhorar.

Eu olhei uma issue de um tempo atrás => https://github.com/rails/strong_parameters/issues/119

Será que não funciona se você fizer assim:

params.permit(:name,:age,:gender, {items:[]})

Aqui outro post => https://jaketrent.com/post/permit-array-rails-strong-parameters/

Caso já tenha resolvido, ótimo também. Se puder, posta aqui a resposta :).

Olá Alberto,

Sem problemas durante as festas de final de ano é aceitável =)

Já havia lido esses artigos tanto que cheguei a uma solução, mas não sei se é a melhor...

Estou passando os itens em uma string array no seguinte formato nome:quantidade exemplo "Pedra:2, Chapeu:1" e a partir disso eu crio uma lista do objeto item e associo ao usuário mas como disse não sei se é a melhor solução.

Controller

def create
        @usuario = Usuario.new(usuario_params)    
        @usuario.items << set_item
        if @usuario.save
            render json: @usuario, status: :created
        else
            render json: nil ,status: :not_acceptable
        end
    end


private
    def usuario_params
         params.permit(:name,:age,:gender,:lon,:lat,:items=>[:name,:quantity])
    end

    def set_item
        items = params[:items]
        if !items.empty? 
            items = items.split(",")
            items.map{|i|
                array = i.split(":")
                Item.new name: array[0], quantity:array[1]
            }
        end
    end