Несколько операторов спасения в Rails Create не работают

Я использую open-uri и файл seed.db. Я пытаюсь запустить следующий код, используя «rake db:seed --trace»:

CSV.foreach("vendor/users1.csv", { :col_sep => ",",  :quote_char => "\"", :headers => true}) do |row|

user = User.find_by_email("sample#{i}@foobardne.com")

    if (!user.picture_url.nil?)
        begin
            file = open user.picture_url
            user.avatar = file
        rescue OpenURI::HTTPError => error
            user.avatar = nil
        rescue OpenURI::HTTPRedirect => redirect
            user.avatar = nil
        end
            user.password = user.password_confirmation = "foobar"
            user.save
    end

По какой-то причине каждый раз, когда я запускаю команду, она не распознает мой второй оператор спасения для перенаправления, и я получаю следующий вывод (конец которого я сократил):

** Invoke db:seed (first_time)
** Execute db:seed
** Invoke db:abort_if_pending_migrations (first_time)
** Invoke environment (first_time)
** Execute environment
** Invoke db:load_config (first_time)
** Execute db:load_config
** Execute db:abort_if_pending_migrations
rake aborted!
redirection forbidden:     http://cellbio.med.harvard.edu/faculty/artavanis/images/artavanis4_2002.jpg -> https://cellbio.med.harvard.edu/faculty/artavanis/images/artavanis4_2002.jpg

Любая идея, почему мой код не улавливает ошибку перенаправления? Любая помощь действительно приветствуется!


person Jason Brooks    schedule 11.03.2013    source источник


Ответы (2)


Не похоже, что выдается ошибка OpenURI::HTTPRedirect. Попробуйте это, чтобы проверить, какая ошибка срабатывает:

begin
  ...
rescue => e
  puts e.inspect
end

если бы ошибка была StandardError, то возвращалось бы puts e.inspect:

#<StandardError: StandardError>
person Sam    schedule 11.03.2013
comment
Когда я пытаюсь это сделать, я получаю Невозможно массовое назначение защищенных атрибутов: inteRst5, есть идеи? - person Jason Brooks; 12.03.2013
comment
Эта ошибка означает, что вы пытаетесь сохранить модель с параметром :inteRst5, но не разрешили обновлять этот атрибут с помощью метода attr_accessible в своей модели. - person Sam; 12.03.2013

Нашел проблему. В библиотеке ruby ​​есть патч для файла open-uri.rb.
Заменить:

(/\A(?:http|ftp)\z/i =~ uri1.scheme && /\A(?:http|ftp)\z/i =~ uri2.scheme)

С участием:

(/\A(?:https?|ftp)\z/i =~ uri1.scheme && /\A(?:https?|ftp)\z/i =~ uri2.scheme)

в файле open-uri.rb. Проблема с переадресацией http -> https. Этот файл был найден для меня в:

/Users/MyName/.rvm/rubies/ruby-2.0.0-p0/lib/ruby/2.0.0/open-uri.rb
person Jason Brooks    schedule 12.03.2013