2016-03-04 4 views
2

Я писал тест для обновления изображений в приложении моих рельсов. Модель изображений в моем приложении является полиморфной ассоциацией и относится к нескольким образцам. Я тестирую процесс создания, обновления и уничтожения действий в тестах интеграции. Я успешно протестировал действие create. Его работа прекрасна. Проблема, с которой я столкнулась, связана с действием обновления.тестирование полиморфной ассоциации в рельсах

Ниже приведена модельная ассоциация с моделью изображений.

class Picture < ActiveRecord::Base 
    belongs_to :pictureable, polymorphic: true 

# each user has one picture 
    has_one :picture, as: :pictureable 

#each scoreboard has one picture 
    has_one :picture, as: :pictureable, dependent: :destroy 

Код для picture_update_test приведен ниже.

def setup 
    @picture = pictures(:picture_a) #this is the picture associated with pictureable (scoreboard_a) 
    @scoreboard = scoreboards(:scoreboard_a) #pictureable is scoreboard_a 
    end 

    test "successful update where pictureable is scorebaord" do 
    patch scoreboard_picture_path(@scoreboard, @picture), picture: {picture: "blank-prof.jpg"} 
    end 

Код в файле picture.yml приведен ниже.

picture_a: 
    picture: "blank-prof.jpg" 
    pictureable_type: scoreboard 

После запуска тестов я получаю следующее сообщение об ошибке.

NoMethodError: undefined method `update_attributes' for nil:NilClass 
    app/controllers/pictures_controller.rb:19:in `update' 

Код контроллера изображения также приведен ниже.

def update 
    @picture = @pictureable.picture 
    if @picture.update_attributes(picture_params) 
     redirect_to @pictureable 
     flash[:success] = "Picture updated successfully" 
    else 
     redirect_to @pictureable 
     flash[:danger] = "An error occured, please try again!" 
    end 
end 

Я считаю, если @pictureable является пользователь или табло, разделив URL. Код приведен ниже.

def load_pictureable 
    resource, id = request.path.split('/')[1,2] 
    @pictureable = resource.singularize.classify.constantize.find(id) 
end 

Для этого метода запускается before_filter. before_filter :load_pictureable.

В тестах мне не нужно разделить URL-адрес. Я специально указываю путь URL, scoreboard_picture_path или 'user_picture_path'. Мне просто нужно передать scoreboard_id и picture.id. Ошибка сообщает update_attributes для класса nil. Я действительно не уверен, почему я получаю эту ошибку. Я не уверен, что файл pictures.yml верен с точки зрения ассоциации. Как всегда, любая помощь будет принята с благодарностью. Благодаря!!

+0

В сообщении об ошибке сообщается, что «@picture» равен нулю в вашем методе обновления. Теперь вам нужно выяснить, является ли «@picturable» тем, что вы думаете. Если бы это была моя ошибка, я бы посмотрел в test.log, чтобы проверить sql, а затем запустить отладчик и установить точку останова в методе load_picturable. – Meier

ответ

2

В yaml вы устанавливаете pictureable_type, но не picturable_id, и поэтому ассоциация не строится правильно.

Вы можете see the fixtures docs примеры создания полиморфных ассоциаций светильников, но в основном вместо того, что вы делаете, вы должны быть в состоянии сделать что-то вроде:

picture_a: 
    picture: "blank-prof.jpg" 
    pictureable: scoreboard_a (Scoreboard) 

Это должно затем позволить @pictureable.picture вернуть картину ,

+1

Я прочитал документацию. У меня было ощущение, что мой файл скрепки ошибочен. Я знал, что мне нужно отредактировать картинку, связанную с возможностью отображения. Я все равно должен был бы определить картину. pictureable = табло (: scoreboard_a) в моей настройке. Все работало нормально. Огромное спасибо!!! –

+0

Добро пожаловать. – smathy

Смежные вопросы