Правильный синтаксис для спасения и следующего в каждом цикле
У меня есть довольно простой оператор if в контроллере следующим образом:
if citation_array.blank?
flash.now[:error] = "There was a problem saving the publications selected!"
@user = current_user
render 'pubmed_search'
else
citation_array.each do |user_publication|
begin
publication = Publication.new
render_publication(user_publication)
publication.citation = user_publication
publication.user_id = current_user.id
publication.title = @title
publication.authors = @authors
publication.journal = @journal
publication.year = @year
publication.volume = @volume
publication.pages = @pages
if publication.save
next
end
rescue
next
end
end
@user = current_user
redirect_to current_user
return false
end
Он обслуживается массивом идентификаторов в citation_array, и если присутствуют значения, он проходит через них, сохраняя каждую публикацию, найденную идентификаторами в массиве. Метод render_publication создает экземпляры переменных экземпляра, поэтому не беспокойтесь об этом.
Моя проблема заключается в следующем. Очень редко идентификатор является фальшивым или неправильным, и поэтому этот блок завершается ошибкой. Я хочу просто перейти к следующему идентификатору в массиве и забыть о сбойном идентификаторе. Мне даже не нужно сохранять исключение. Я новичок в Ruby (из PHP фона).
Я хочу проверить правильность этого синтаксиса. У меня проблемы с проверкой в консоли рельсов.
2 ответа
Синтаксические ошибки легче обнаружить, если код имеет правильный отступ.
if citation_array.blank?
flash.now[:error] = "There was a problem saving the publications selected!"
@user = current_user
render 'pubmed_search'
else
citation_array.each do |user_publication|
begin
publication = Publication.new
render_publication(user_publication)
publication.citation = user_publication
publication.user_id = current_user.id
publication.title = @title
publication.authors = @authors
publication.journal = @journal
publication.year = @year
publication.volume = @volume
publication.pages = @pages
if publication.save
next
end
rescue
next
end
end
@user = current_user
redirect_to current_user
return false
end
Синтаксис кажется правильным. Хотя более простой способ выяснить это - просто запустить код.
Некоторые вещи в коде не являются необходимыми, хотя. Немного очистив ваш код, он выглядел бы примерно так с той же функциональностью.
@user = current_user
if citation_array.blank?
flash.now[:error] = 'There was a problem saving the publications selected!'
render 'pubmed_search'
else
citation_array.each do |user_publication|
begin
render_publication(user_publication)
Publication.create!( # create! here so that if something does go wrong, then you're not just ignoring it, but you can log it in your rescue block.
citation: user_publication,
user_id: current_user.id,
title: @title,
authors: @authors,
journal: @journal,
year: @year,
volume: @volume,
pages: @pages
# This hash should be extracted to a method.
)
rescue
# Just doing nothing here is valid syntax, but you should at least log your error.
end
end
redirect_to current_user
false # This can most likely be omitted as well since not many places care about the return value of a controller action.
end
Синтаксис для начала спасения,
begin
your code...
rescue => e
Rails.logger.debug 'Exception is #{e}'
end