Frage

Ich habe STI Implementierung wie folgt:

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

Ich bin eine Liste von Autos für einen Benutzer zu schaffen. Für jedes Automobil setzt die UI das type Feld und die Eigenschaften der Formulareinreichung automobile.While verbunden ist, wird das type Feld ignoriert, da es ein geschütztes Attribut ist.

Wie arbeite ich dieses Problem um? Gibt es eine deklarative Weise ein geschütztes Attribut unprotect?

Edit: Dies ist meine aktuelle Lösung für das Problem: Ich überschreibe die attributes_protected_by_default private Methode in meiner Modellklasse.

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

Dies entfernt das type Feld aus der geschützten Liste.

Ich hoffe, dass es ein besserer Weg, als dies.

War es hilfreich?

Lösung

ich am Ende tun dies:

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

Andere Tipps

würde ich eine Hilfsmethode auf Benutzer hinzufügen, die die entsprechende Unterklasse instanziiert:

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

Verwenden Sie es wie folgt aus:

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

Der obige Code ist „sicher“: Ein Angreifer kann nicht inject beliebigen Text in Ihre automobiles.type Spalte. Ihre Lösung, während es funktioniert, hat den Nachteil, so dass Angriffe.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top