Strong Parameters
Como parte da migração do Rails 3 para o Rails 4 pode-se adicionar a gem strong_parameters para mudar a forma como os atributos são protegidos.
O que, ao meu ver, é melhor, pois pode-se controlar quais atributos são permitidos em que situação (controller) ao invés de apenas definir globalmente.
Configurando
É necessário desativar o config.active_record.whitelist_attributes
da aplicação, normalmente essa configuração fica no config/application.rb
:
config.active_record.whitelist_attributes = false
E fazer o include do ActiveModel::ForbiddenAttributesProtection
em cada model. Uma configuração alternativa (e mais prática) é fazer esse include em todos os models, para isso basta criar um arquivo no
config/initializers/
com o seguinte conteúdo:
ActiveRecord::Base.send(:include, ActiveModel::ForbiddenAttributesProtection)
Usos
Encontrei os seguintes comportamentos:
- Não aceita passar o
type
(pode ser usando para trabalhar com herança noActiveRecord
); - Quando passa um relacionamento has and belongs to many tem que colocar um array como possível atributo, algo como:
author_ids: []
; - Quando passa um nested form tem que colocar o
:id
e o:_destroy
, se não passar o:id
, quando for editar, será feito uma tentativa de criar um novo objeto e se não passar o:_destroy
nenhum objeto poderá ser apagado;
Algo que precisei foi um formulário iniciar com valores provenientes de um link, por exemplo:
link_to t(".create"), new_item_path(item: { parent_id: @item.id })
Para funcionar fiz algo semelhante a isso na action new do controller:
def new
@item = Item.new(params[:item].present? ? item_params : {})
end