Правильный синтаксис для спасения и следующего в каждом цикле

У меня есть довольно простой оператор 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

Другие вопросы по тегам