Как attr_accessible используется в Rails 4?

attr_accessible Кажется, больше не работает в моей модели.

Как можно разрешить массовое назначение в Rails 4?

6 ответов

Решение

Rails 4 теперь использует сильные параметры.

Защита атрибутов теперь выполняется в контроллере. Это пример:

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

  private

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

Не нужно устанавливать attr_accessible в модели больше.

Имея дело с accepts_nested_attributes_for

Для того, чтобы использовать accepts_nested_attribute_for с сильными параметрами вам нужно будет указать, какие вложенные атрибуты должны быть в белом списке.

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

Ключевые слова говорят сами за себя, но на всякий случай вы можете найти больше информации о сильных параметрах в руководстве по Rails Action Controller.

Примечание: если вы все еще хотите использовать attr_accessible нужно добавить protected_attributes на ваш Gemfile, В противном случае вы столкнетесь с RuntimeError,

Если вы предпочитаете attr_accessible, вы можете использовать его и в Rails 4. Вы должны установить его как gem:

gem 'protected_attributes'

после этого вы можете использовать attr_accessible в ваших моделях, как в Rails 3

Кроме того, и я думаю, что это лучший способ - использовать объекты форм для работы с массовым присваиванием и сохранения вложенных объектов, и вы также можете использовать gem protected_attributes таким образом

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

Обновление для Rails 5:

gem 'protected_attributes' 

кажется, больше не работает. Но дайте:

драгоценный камень 'protected_attributes_continued'

попытка

Мы можем использовать

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

где person это Model, вы можете передать этот код в методе person_params и использовать вместо params[:person] в методе create или методе else

1) Обновите Devise, чтобы он мог обрабатывать Rails 4.0, добавив эту строку в Gemfile вашего приложения:

gem 'devise', '3.0.0.rc' 

Затем выполните:

$ bundle

2) Добавьте старый функционал attr_accessible опять на рельсы 4.0

Попробуй использовать attr_accessible и не комментируйте это.

Добавьте эту строку в Gemfile вашего приложения:

gem 'protected_attributes'

Затем выполните:

$ bundle

Мне пришлось перенести приложение Rails с 3.2 на 6.1, поэтому даже гем "protected_attributes" не подходил. Я ценю аргументы в пользу использования require(). Allow () в контроллере, но я не хотел повторно вводить или вырезать и вставлять все эти атрибуты из моделей, поэтому я решил вместо этого использовать этот код инициализатора (поместить в файл в конфиге / инициализаторах):

      # fix attr_accessible in an initializer
# wrap ActionController::Parameters code in singleton method defined
# from attr_accessible so controller code can call class method
# to get permitted parameter list
# e.g. model: class A < ActiveRecord::Base,
# controller calls A.permit_attr(params)
# lots simpler than moving all attr_accessible definitions to controllers
# bug: fails if more than one attr_accessible statement

def (ActiveRecord::Base).attr_accessible *fields
  puts "attr_accessible:"+self.name+":permitted_params fields=#{fields.inspect}"
  define_singleton_method("permit_attr") { |params|
    # may have subclasses where attr_accessible is in superclass
    # thus must require by subclass name so should calculate require at runtime
    rq = self.name.downcase.to_sym
    puts "...permit_attr:self=#{rq} permit(#{fields.inspect})"
    params.require(rq).permit(fields)
  }

end
Другие вопросы по тегам