attr_accessible
parece não funcionar mais dentro do meu modelo.
Qual é a maneira de permitir a atribuição em massa no Rails 4?
attr_accessible
parece não funcionar mais dentro do meu modelo.
Qual é a maneira de permitir a atribuição em massa no Rails 4?
Respostas:
O Rails 4 agora usa parâmetros fortes .
A proteção de atributos agora é feita no controlador. Isto é um exemplo:
class PeopleController < ApplicationController
def create
Person.create(person_params)
end
private
def person_params
params.require(:person).permit(:name, :age)
end
end
Não é mais necessário definir attr_accessible
o modelo.
accepts_nested_attributes_for
Para usar accepts_nested_attribute_for
com parâmetros fortes, você precisará especificar quais atributos aninhados devem ser incluídos na lista de permissões.
class Person
has_many :pets
accepts_nested_attributes_for :pets
end
class PeopleController < ApplicationController
def create
Person.create(person_params)
end
# ...
private
def person_params
params.require(:person).permit(:name, :age, pets_attributes: [:name, :category])
end
end
As palavras-chave são auto-explicativas, mas por precaução, você pode encontrar mais informações sobre parâmetros fortes no guia do Rails Action Controller .
Nota : Se você ainda deseja usar attr_accessible
, precisará adicionar protected_attributes
ao seu Gemfile
. Caso contrário, você será confrontado com um RuntimeError
.
RuntimeError in MicropostsController#index 'attr_accessible' is extracted out of Rails into a gem. Please use new recommended protection model for params(strong_parameters) or add 'protected_attributes' to your Gemfile to use old one.
Se você preferir attr_accessible, também poderá usá-lo no Rails 4. Você deve instalá-lo como gem:
gem 'protected_attributes'
depois disso, você poderia usar attr_accessible em seus modelos, como no Rails 3
Além disso, e acho que é a melhor maneira de usar objetos de formulário para lidar com atribuição em massa e salvar objetos aninhados, e você também pode usar a gema protected_attributes dessa maneira
class NestedForm
include ActiveModel::MassAssignmentSecurity
attr_accessible :name,
:telephone, as: :create_params
def create_objects(params)
SomeModel.new(sanitized_params(params, :create_params))
end
end
Podemos usar
params.require(:person).permit(:name, :age)
onde person é Model, você pode passar esse código em um método person_params e usá-lo no lugar de params [: person] no método create ou no método
Uma atualização para o Rails 5:
gem 'protected_attributes'
parece não funcionar mais. Mas dê:
gem 'protected_attributes_continued'
uma tentativa.
1) Atualize o Devise para que ele possa lidar com o Rails 4.0 adicionando esta linha ao Gemfile do seu aplicativo:
gem 'devise', '3.0.0.rc'
Em seguida, execute:
$ bundle
2) Adicione a funcionalidade antiga de attr_accessible
novo ao Rails 4.0
Tente usar attr_accessible
e não comente isso.
Adicione esta linha ao Gemfile do seu aplicativo:
gem 'protected_attributes'
Em seguida, execute:
$ bundle
attr_accessible
precisava ser removido. O que acontecerá se mantivermos?