2013-02-21 2 views
1

Как я могу указать Ruby (Rails) игнорировать защищенные переменные, которые присутствуют при назначении массы?Ruby - игнорировать защищенные атрибуты

class MyClass < ActiveRecord::Base 
    attr_accessible :name, :age 
end 

Теперь я массово назначить хэш для создания нового MyClass.

MyClass.create!({:name => "John", :age => 25, :id => 2}) 

Это даст мне исключение:

ActiveModel::MassAssignmentSecurity::Error: Can't mass-assign protected attributes: id 

Я хочу, чтобы создать новый MyClass с указанным (незащищенный) атрибуты и игнорировать атрибут id.

С другой стороны: как я могу игнорировать неизвестные атрибуты. Например, MyClass не имеет атрибута location. Если я попытаюсь назначить его массой, просто проигнорируйте его.

ответ

2

Установка mass_assignment_sanitizer на :logger решена проблема при разработке и тестировании.

config.active_record.mass_assignment_sanitizer = :logger 
5

Используйте Hash#slice, чтобы выбрать только те кнопки, которые на самом деле заинтересованы в назначении:

# Pass only :name and :age to create! 
MyClass.create!(params.slice(:name, :age)) 

Обычно я добавляю метод обертки для params в мой контроллер, который фильтрует его вниз только поля, которые я знаю Я хочу назначен:

class MyController 

    # ... 

    def create 
    @my_instance = MyClass.create!(create_params) 
    end 

protected 

    def create_params 
    params.slice(:name, :age) 
    end 
end 
+2

Итак? В этом весь смысл. Вы принимаете только переменные, о которых вы * знаете. Переменные, о которых вы не знаете, - это то, что вы когда-то убирали, вы вырезаете и используете те, о которых вы * знаете. – meagar

+0

Да, вам нужно подумать о том, что вы обновляете/создаете, когда назначаете вещи. В этом и заключается причина, по которой Rails по умолчанию включила защиту массового присвоения. Это решение только назначает переменные, которые вы определяете, которые должны быть такими, какие вы хотите. –

+0

@MichaelPapile Вправо. Как я могу получить незащищенные атрибуты для определенного класса? –

1

Вы можете использовать strong_parameters драгоценный камень, который будет находиться в рельсах 4.

См DOCUME ntation here.

Таким образом, вы можете указать параметры, которые вы хотите, например, действием или ролью.

+0

Полезно знать. На данный момент мне нужно что-то простое, не добавляя никаких драгоценных камней. –

0

Если вы хотите, чтобы получить вниз и грязные с ним, и динамически пусть только атрибуты модель, через, без отключения ActiveModel :: MassAssignmentSecurity :: Ошибки во всем мире:

params = {:name => "John", :age => 25, :id => 2} 
MyClass.create!(params.slice(*MyClass.new.attributes.symbolize_keys.keys) 

The .symbolize_keys требуется если вы используете символы в своем хеше, как в этой ситуации, но вам может и не понадобиться.

Смежные вопросы