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 no ActiveRecord);
  • 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