Я писал тест для обновления изображений в приложении моих рельсов. Модель изображений в моем приложении является полиморфной ассоциацией и относится к нескольким образцам. Я тестирую процесс создания, обновления и уничтожения действий в тестах интеграции. Я успешно протестировал действие 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 верен с точки зрения ассоциации. Как всегда, любая помощь будет принята с благодарностью. Благодаря!!
В сообщении об ошибке сообщается, что «@picture» равен нулю в вашем методе обновления. Теперь вам нужно выяснить, является ли «@picturable» тем, что вы думаете. Если бы это была моя ошибка, я бы посмотрел в test.log, чтобы проверить sql, а затем запустить отладчик и установить точку останова в методе load_picturable. – Meier