我有一个动作,在每个循环中执行一系列验证,向数据库提交EventSubscription
中创建的每个EventSubscription.create!
的值。
如果某些验证失败,我想回滚以前提交的事务。为了做到这一点,我将代码放在ActiveRecord:Base.transaction
块中,但是当验证失败并引发异常时,救援块甚至没有被执行,因此不会重定向到指示的页面,我想要重定向到该页面。这可能有什么不对?你能帮忙吗?
提前谢谢!
这是我的行动代码:
def download_subscriptions_file
ActiveRecord::Base.transaction(requires_new: true) do
begin
# ambiente para o qual vao ser criadas as subscricoes
@environment = Environment.find(params[:env_id])
uploaded_file = params[:file]
if uploaded_file
# Le e faz parse do ficheiro carregado
file = File.read(uploaded_file.path)
parsed_file = JSON.parse(file)
# logger.debug {parsed_file["eventSubscriptions"]}
# obtem as ARS e grava na tabela entities da BD do backoffice
parsed_file["eventSubscriptions"].each do |code, event|
# logger.debug {event}
# procura o evento correspondente, pois tem de existir na BD do BO
db_event = Event.find_by(display_name: code)
if !db_event
raise Exception.new("Não foi possivel importar o ficheiro pois não foi encontrado qualquer evento na BD com o nome #{code}")
end
event.each do |entity_code, subs|
# logger.debug {subs["_description"]}
# procura o tipo de endpoint correspondente, pois tem de existir na BD do BO
endpoint_type = EndpointType.find_by(description: subs["endpointId"])
if !endpoint_type
raise Exception.new('something bad happened!')
end
# procura a aplicacao no endpoint correspondente, pois tem de existir na BD do BO
endpoint_app = EndpointApp.find_by(description: subs["endpointAppId"])
if !endpoint_app
raise Exception.new('something bad happened!')
end
if entity_code != "default"
# procura a entidade correspondente, pois tem de existir na BD do BO
entity = Entity.find_by("code LIKE ?", "#{entity_code}%")
if !entity
raise Exception.new('something bad happened!')
end
active = "f"
# Verifica se a subscricao esta ou nao ativa para comparar com a que esta na BD e decidir se eh para mudar
if subs["status"] == "active"
active = "t"
end
# logger.debug { "entity->#{entity.code} #{entity.name}" }
# So cria/atualiza se nao existir a subscricao na BD para o ambiente em causa
entity_subs = EventSubscription.find_by(entity_id: entity.id, active: active, environment_id: @environment.id)
if !entity_subs
EventSubscription.create!(event_id: db_event.id, entity_id: entity.id, description: subs["_description"],
active: active, endpoint_type_id: endpoint_type.id, endpoint_app_id: endpoint_app.id,
environment_id: @environment.id)
end
end
end
end # parsed_file["eventSubscriptions"].each
respond_to do |format|
format.html {redirect_to env_event_subscriptions_path(env: @environment.id), notice: "Ficheiro de subscrições importado com sucesso para a BD do BackOffice no ambiente de #{@environment.name}." and return}
end
else
respond_to do |format|
format.html {redirect_to env_event_subscriptions_path(env: @environment.id), alert: 'Não foi selecionado qualquer ficheiro para importar.' and return}
end
end
rescue => exception
logger.error {"event_subscriptions_controller.download_subscriptions_file -> Ocorreu um erro ao importar o ficheiro de susbcricoes: #{exception.message}"}
respond_to do |format|
format.html {redirect_to env_event_subscriptions_path(env: @environment.id),
alert: "Ocorreu um erro ao importar o ficheiro de susbcrições: #{exception.message}" and return}
end
end
end
end
答案 0 :(得分:0)
问题解决了!
而不是提出Exception.new("message"
)仅提出消息(raise "message"
)并将rescue => exception
更改为rescue Exception => e
,并打印相应的消息。
在此处找到解决方案:http://rubylearning.com/satishtalim/ruby_exceptions.html
非常感谢!