markdown Atributos Aninhados

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了markdown Atributos Aninhados相关的知识,希望对你有一定的参考价值。

## Atributos Aninhados ##

Muitas vezes, em um único formulário queremos adicionar records em mais de uma tabela, e isso pode ser um grande problema se não soubermos usar atributos aninhados dentro do Rails.

Para fazer isso, precisamos preparar nosso Model, nossa Controler e por fim a view.

No model, faremos o seguinte em nosso código:

## Preparando o Model ##
```Ruby
class Contact < ApplicationRecord

  accepts_nested_attributes_for :address

end
```

Adicionaremos a linha de código acima, que basicamente informa ao model para aceitar atributos aninhados do model de "endereços".

Também podemos passar parâmetros, tais como validar em caso de campos vazios ou permitir a exclusão desses dados relacionais também.

```Ruby
class Contact < ApplicationRecord

  accepts_nested_attributes_for :phones, reject_if: :all_blank, allow_destroy: true

end
```

## Preparando o Controller ##

Agora, precisamos informar aos nossos controllers que aceitamos os fields de "contact". Iremos fazer isso modificamos nosso método "contact_params"

```Ruby
class ContactsController < ApplicationController

  def contact_params
    params.required(:contact).permit(:name
      address_attributes: [:street, :number, :neighborhood]
    )
  end

end
```

Dessa maneira nosso controller fica preparado para receber parâmetros de outros modelos se necessário.

E também precisamos adicionar o código abaixo na nossa action new, para que nossa view possa exibir os novos campos quando necessário:

```Ruby
class ContactsController < ApplicationController

  def new
    @contact = Contact.new
    @contact.build_address
  end

end
```

## Preparando a View ##

Em nossa view, além de toda a regra padrão, utilizaremos um helper para delimitar os campos oriundos de outro modeo:

```Ruby
<%= form_for @contact do |f| %>
  
  <%= f.fields_for :address do |a| %>
    <div>
      <%= a.label :street %>
      <%= a.text_field :street %>
    </div>
    <div>
      <%= a.label :number %>
      <%= a.text_field :number %>
    </div>
    <div>
      <%= a.label :neighborhood %>
      <%= a.text_field :neighborhood %>
    </div>
  <% end %>
  
<% end %>
```

Utilizando o helper "fields_for" seguido do modelo ":address", resolvemos nosso problema na view.

## E por último... ##

E por último é importante que façamos uma coisa, quando temos um "address" que belongs_to "contact", nós só conseguimos criar um endereço se já existir um contato no banco de dados para ele ter um relacinamento, certo? Porém como estaremos no ato de criação de um novo contato e ao mesmo tempo de um endereço, o contato ainda não foi salvo no banco e o mesmo ainda não possui um ID. Então para isso, será necessário fazermos o seguinte.

No nosso modelo de "Address" faremos a seguinte mudança:

```Ruby
class Address < ApplicationRecord
  belongs_to :contact, required: false
end
```

Adiciona "required: false", ele ignora a obrigatioriedade de ter um ID no momento do cadastro, e fará o cadastro corretamente e posteriormente a atribuição do ID recém cadastrado.

以上是关于markdown Atributos Aninhados的主要内容,如果未能解决你的问题,请参考以下文章

text 禁用财产,propiedad desabilitado jquery / atributos

html Modificar atributos especificos deunaclassía

text Eliminar los filtros por defecto de magento y agregar nuevos filtros de atributos custom

Markdown温故知新:Markdown面面观

markdown转换为图片

转换rst到markdown总结