Wie zu überschreiben die attr_protected?
-
22-09-2019 - |
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.
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.