Я бы, вероятно, расширил ActiveRecord с помощью метода отключения, чтобы вы могли вызывать @ model.disable () точно так же, как @ model.destroy (). Таким образом, вы можете оставить все маршруты по умолчанию как есть и просто изменить действие уничтожения в вашем контроллере, чтобы попытаться отключить () вместо уничтожения ().
Возможно, вот так:
module MyDisableModule
def self.included(recipient)
recipient.class_eval do
include ModelInstanceMethods
end
end
# Instance Methods
module ModelInstanceMethods
#Here is the disable()
def disable
if self.attributes.include?(:disabled)
self.update_attributes(:disabled => true)
else
#return false if model does not have disabled attribute
false
end
end
end
end
#This is where your module is being included into ActiveRecord
if Object.const_defined?("ActiveRecord")
ActiveRecord::Base.send(:include, MyDisableModule)
end
А потом в вашем контроллере:
def destroy
@model = Model.find(params[:id])
if @model.disable #instead of @model.destroy
flash[:notice] = "Successfully disabled #{@model.name}."
redirect_to #wherever
else
flash[:notice] = "Failed to disable #{@model.name}."
render :action => :show
end
end
Обратите внимание, что в этом примере отключено - это атрибут, а отключение - это метод, который делает модель отключенной.