Как переопределить attr_protected? - PullRequest
2 голосов
/ 27 марта 2010

У меня есть реализация STI следующим образом:

class Automobile < ActiveRecord::Base
end

class Car < Automobile
end

class Truck < Automobile
end

class User < ActiveRecord::Base
  has_many :automobiles
  accepts_nested_attributes_for :automobiles
end

Я создаю список автомобилей для пользователя. Для каждого автомобиля пользовательский интерфейс устанавливает поле type и свойства, связанные с автомобилем. При отправке формы поле type игнорируется, поскольку является защищенным атрибутом.

Как мне обойти эту проблему? Есть ли декларативный способ unprotect защищенного атрибута?

Edit: Это мое текущее решение проблемы: Я переопределил приватный метод attributes_protected_by_default в своем классе модели.

class Automobile < ActiveRecord::Base
private
  def attributes_protected_by_default
    super - [self.class.inheritance_column]
  end
end

Это удаляет поле type из защищенного списка.

Я надеюсь, что есть лучший способ, чем этот.

Ответы [ 2 ]

1 голос
/ 21 апреля 2010

Я закончил этим:

class Automobile < ActiveRecord::Base
private
  def attributes_protected_by_default
    super - [self.class.inheritance_column]
  end
end
0 голосов
/ 27 марта 2010

Я бы добавил вспомогательный метод для пользователя, который создает соответствующий подкласс:

class User < ActiveRecord::Base
  def self.automobile_from_type(type)
    self.automobiles << case type
    when "Car"
      Car.new
    when "Truck"
      Truck.new
    else
      raise ArgumentError, "Unknown automobile type: #{type.inspect}"
    end
  end
end

Используйте это так:

class AutomobilesController < ApplicationController
  def create
    @automobile = current_user.automobile_from_type(params[:automobile][:type])
    if @automobile.update_attributes(params[:automobile]) then
      redirect_to @automobile
    else
      render :action => :new
    end
  end
end

Приведенный выше код является "безопасным": злоумышленник не может вставить произвольный текст в ваш столбец carss.type. Ваше решение, несмотря на то, что оно работает, имеет недостаток, заключающийся в разрешении атак.

...