W jaki sposób attr_accessible jest używany w Railsach 4?

258

attr_accessible wydaje się, że nie działa już w moim modelu.

Jak można zezwolić na masowe przydzielanie w Rails 4?

użytkownik2532974
źródło

Odpowiedzi:

447

Rails 4 używa teraz silnych parametrów .

Ochrona atrybutów jest teraz wykonywana w kontrolerze. To jest przykład:

class PeopleController < ApplicationController
  def create
    Person.create(person_params)
  end

  private

  def person_params
    params.require(:person).permit(:name, :age)
  end
end

Nie trzeba już ustawiać attr_accessiblew modelu.

Do czynienia z accepts_nested_attributes_for

Aby używać accepts_nested_attribute_forz silnymi parametrami, musisz określić, które zagnieżdżone atrybuty powinny znajdować się na białej liście.

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

Słowa kluczowe są oczywiste, ale na wszelki wypadek można znaleźć więcej informacji o mocnych parametrach w przewodniku Rails Action Controller .

Uwaga : jeśli nadal chcesz używać attr_accessible, musisz dodać protected_attributesdo swojego Gemfile. W przeciwnym razie będziesz mieć do czynienia z RuntimeError.

Pierre-Louis Gottfrois
źródło
1
W dokumencie nie stwierdzono, że attr_accessiblenależy go usunąć. Co się stanie, jeśli go zatrzymamy?
lulalala
12
Otrzymasz błąd, jeśli nie wprowadzisz żadnych zmian w swoim pliku Gemfile. 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.
użytkownik
6
Świetne wyjaśnienie. Wydaje się jednak, że w praktyce powoduje to odsuwanie Railsów od modelu tłuszczu, cienkiego kontrolera itp. W kierunku cienkich modeli i naprawdę rozdętych kontrolerów. Musisz napisać wszystkie te rzeczy dla każdego wystąpienia, nie ładnie czyta, a zagnieżdżanie wydaje się być problemem. Stary attr_accessible / attr_accessor w systemie modelowym nie był uszkodzony i nie musiał być naprawiany. W tym przypadku jeden post na blogu stał się zbyt popularny.
rcd
1
Nie musisz obsługiwać dozwolonych parametrów w kontrolerach. W rzeczywistości jest to naruszenie zasady pojedynczej odpowiedzialności. Spójrz na następujący wpis na blogu edelpero.svbtle.com/strong-parameters-the-right-way
Pierre-Louis Gottfrois
3
Więc wymyślni i często zmieniający się apis, w połączeniu z nowo odkrytą pedantiką, marnują wiele godzin programistów w kolejnej bolesnej aktualizacji Railsów :-(
Brian Takita
22

Jeśli wolisz attr_accessible, możesz użyć go również w Rails 4. Powinieneś zainstalować go jak klejnot:

gem 'protected_attributes'

potem możesz użyć attr_accessible w swoich modelach jak w Rails 3

I myślę, że to najlepszy sposób - używanie obiektów formularzy do radzenia sobie z przypisywaniem masy i zapisywanie zagnieżdżonych obiektów, a także w ten sposób można używać klejnotu chronionych atrybutów

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
edikgat
źródło
1
Kiedy używasz „silnych parametrów”, filtrujesz parametry w warstwie kontrolera i nie sądzę, że jest to najlepszy pomysł dla wszystkich aplikacji. Dla mnie najlepszym sposobem filtrowania parametrów jest użycie dodatkowej warstwy. I możemy użyć klejnotu „chronione_atrybuty” do napisania tej warstwy
edikgat
4

Możemy użyć

params.require(:person).permit(:name, :age)

gdzie person to Model, możesz przekazać ten kod do metody person_params i użyć zamiast params [: person] w metodzie create lub metodzie

Hardik Hardiya
źródło
2

Aktualizacja dla Rails 5:

gem 'protected_attributes' 

wydaje się już nie działać. Ale daj:

klejnot „protected_attributes_continued”

próba.

miklki14567
źródło
1

1) Zaktualizuj Devise, aby mógł obsługiwać Rails 4.0, dodając ten wiersz do Gemfile aplikacji:

gem 'devise', '3.0.0.rc' 

Następnie wykonaj:

$ bundle

2) Dodaj starą funkcjonalność attr_accessibleponownie do szyn 4.0

Spróbuj użyć attr_accessiblei nie komentuj tego.

Dodaj tę linię do pliku Gemfile aplikacji:

gem 'protected_attributes'

Następnie wykonaj:

$ bundle
Sid
źródło