W jaki sposób attr jest dostępny w Rails 4?

attr_accessible wygląda na to, że nie działa już w moim modelu.

Jaki jest sposób na masowe przypisanie w Rails 4?

Author: Arslan Ali, 2013-06-28

5 answers

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_accessible w modelu.

Radzenie sobie z accepts_nested_attributes_for

Aby używać accepts_nested_attribute_for z silnymi parametrami, musisz określić, które zagnieżdżone atrybuty mają być 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żesz znaleźć więcej informacji o silnych parametrach w rails Action Controller guide .

Uwaga : jeśli nadal chcesz używać attr_accessible, musisz dodać protected_attributes do twojego Gemfile. W przeciwnym razie będziesz miał do czynienia z RuntimeError.

 440
Author: Pierre-Louis Gottfrois,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-01 14:29:42

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

gem 'protected_attributes'

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

Również, i myślę, że jest to najlepszy sposób-używanie obiektów formularza do radzenia sobie z masowym przypisaniem i zapisywanie zagnieżdżonych obiektów, a także możesz użyć gem protected_attributes w ten sposób

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
 22
Author: edikgat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-03 18:16:40

Możemy użyć

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

Gdzie person jest modelem, możesz przekazać ten kod na metodzie person_params i użyć zamiast params [: person] w metodzie create lub innej metodzie

 4
Author: Hardik Hardiya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-05 10:56:17

1) Zaktualizuj Devise tak, aby mógł obsłużyć Rails 4.0, dodając tę linię do pliku Gemfile Twojej aplikacji:

gem 'devise', '3.0.0.rc' 

Następnie wykonaj:

$ bundle

2) Dodaj ponownie starą funkcjonalność attr_accessible do rails 4.0

Spróbuj użyć attr_accessible i nie komentuj tego.

Dodaj ten wiersz do pliku Gemfile Twojej aplikacji:

gem 'protected_attributes'

Następnie wykonaj:

$ bundle
 1
Author: Sid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-02 04:31:55

Aktualizacja dla Rails 5:

gem 'protected_attributes' 
Wygląda na to, że już nie działa. Ale daj:

Gem 'protected_attributes_continued'

Spróbuj.
 0
Author: miklki14567,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-18 00:16:23