problema com has one

29 views
Skip to first unread message

Kalinna Borges

unread,
Jun 11, 2020, 8:22:38 PM6/11/20
to rails-br
Pessoal,

estou começando um novo projeto com rails 5, mas estou enfrentando o seguinte problema ao tentar criar um novo cliente. Alguém poderia me dizer o que eu estou fazendo de errado?

unknown attribute 'cliente_id' for Endereco.


class Cliente < ApplicationRecord
  has_one :endereco
  accepts_nested_attributes_for :endereco
end

class Endereco < ApplicationRecord
  belongs_to :cliente
end

class CreateClientes < ActiveRecord::Migration[5.2]
 
def change
    create_table :clientes do |t|
     
t.string :nome
    end
  end
end


class CreateEnderecos < ActiveRecord::Migration[5.2]
 
def change
    create_table :enderecos do |t|
     
t.string :logradouro
   
end
  end
end

class AddEnderecoToCliente < ActiveRecord::Migration[5.2]
 
def change
    add_reference :clientes, :endereco, foreign_key: true
  end
end

class ClientesController < ApplicationController
  before_action :set_cliente, only: [:show, :edit, :update, :destroy]


  def new
    @cliente = Cliente.new
   
@cliente.build_endereco

 
end

 
  private
   
    def cliente_params
      params.fetch(:cliente, {})
     
params.require(:cliente).permit(:nome, endereco_attributes: [ :id, :logradouro])
   
endend


Renato Rosa Franco

unread,
Jun 11, 2020, 8:31:47 PM6/11/20
to rails-br
Oi Kalinna, tudo bem?

Vou deixar aqui minhas contribuições.
Se puder evite usar português em um projeto Rails. o framework adota sempre
convenções da lingua inglesa, isso pode ser um grande inconveninente pra você qualquer hora
pelo que eu entendi do seu schema temos

Cliente --- 1:1----- Endereço

ou seja

Client --- 1:1 ---- Address

Entrão imagino que a estrutura deva ser

Cliente
  -> nome

Endereço
  -> Logradouro
  -> cliente_id -:> referencia a tabela cliente

note que na sua migration você adicionou o client a referencia
endereço na tabela cliente, deveria ser o contrario, adicionar
na tabela endereco, a referencia a cliente

e só mudar

add_references :enderecos, :cliente, foreign_key: true

sempre que puder use inglês.
Estamos juntos. qualquer coisa estamos ai.

Kalinna Borges

unread,
Jun 12, 2020, 6:43:00 AM6/12/20
to rails-br
Olá Renato!

Obrigada pelo retorno.

Entendi. Mas ai no caso na class Cliente eu teria um belongs_to: endereco, e em endereco teria has_one: cliente? 

Isso que me deixa em dúvida, pois ao meu ver, seria mais lógico um cliente ter um endereço do que um endereço ter um cliente. Fiquei confusa agora.

*Obrigada pelo toque do inglês. Vou adotar desde já.

Renato Rosa Franco

unread,
Jun 12, 2020, 10:46:17 AM6/12/20
to rails-br
Na verdade a leitura deve ser assim:
Um cliente tem um endereço
Um endereço pertence a um cliente.

o belongs_to vai sempre na tabela que pertence a outra
como nessa caso um endereço pertence a um cliente, fica

class Cliente
 has_one :endereco
end

class Endereco
  belongs_to :cliente
end

Assim explicitamos pro active-record que, um cliente tem apenas um endereço
e um endereço pertence a um cliente.

entao na relação e mais logico dizer que um endereco pertence a um cliente
do que um cliente pertence a um endereço, seria mais como
um cliente tem um endereço, e um endereço pertence a um cliente
port isso a relação esta na tabela endereço


Em quinta-feira, 11 de junho de 2020 21:22:38 UTC-3, Kalinna Borges escreveu:

Kalinna Borges

unread,
Jun 12, 2020, 6:55:16 PM6/12/20
to rails-br
Entendi.

Na verdade, o problema foi só o meu migration.

Mas eu ainda estou com problema. No meu form, não aparece os atributos do endereço. Alguma luz?

<%= form_for @cliente do |form| %>

<%= form.text_field :nome%>

 
<% form.fields_for :endereco do |endereco_form| %>
   
<%= endereco_form.text_field :logradouro  %>
 
<% end %>
<% end %>

Kalinna Borges

unread,
Jun 22, 2020, 10:55:06 AM6/22/20
to rails-br
Alguma luz por gentileza?

Everaldo Gomes

unread,
Jun 22, 2020, 11:05:06 AM6/22/20
to rail...@googlegroups.com
No seu código, só tá ali pra criar o campo do logradouro.

Quais são esses atributos?

--
--
Você recebeu essa mensagem porquê está inscrito no Google
Groups "rails-br".
Para enviar uma mensagem para o grupo, mande um email para rail...@googlegroups.com
Para se descadastrar, mande um e-mail para
rails-br+u...@googlegroups.com
Visite o grupo em http://groups.google.com/group/rails-br?hl=pt-BR
Leia nossa política de uso: https://goo.gl/BHB0wS
---
Você recebeu essa mensagem porque está inscrito no grupo "rails-br" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para rails-br+u...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/rails-br/24910086-56f1-461f-b3bb-d021331c979do%40googlegroups.com.

Vinicius Gati

unread,
Jun 22, 2020, 11:22:37 AM6/22/20
to rails-br
Kalinna no controller faça o seguinte antes de chamar o form

@cliente.endereco = Endereco.new

deve resolver seu problema.
Reply all
Reply to author
Forward
0 new messages