I was writing test for updating images in my rails application. The pictures model in my app is a polymorphic association and it belongs to more than one model. I am testing the create, update and destroy action workflow in the integration tests. I have tested the create action successfully. Its working fine. The problem I am having is with the update action.
The model association with the pictures model is given below.
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
The code for the picture_update_test is given below.
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
The code in the picture.yml file is given below.
picture_a:
picture: "blank-prof.jpg"
pictureable_type: scoreboard
Once I run the tests, I get the following error.
NoMethodError: undefined method `update_attributes' for nil:NilClass
app/controllers/pictures_controller.rb:19:in `update'
The picture controller code is also given below.
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
I find out if @pictureable is a user or a scoreboard by splitting the url. The code is given below.
def load_pictureable
resource, id = request.path.split('/')[1,2]
@pictureable = resource.singularize.classify.constantize.find(id)
end
I run a before_filter for that method. before_filter :load_pictureable
.
In the tests, I don't need to split any url. I am specifically stating the url path, scoreboard_picture_path
or 'user_picture_path'. I just have to pass the scoreboard_id and the picture.id. The error states update_attributes for nil class. I am really not sure why I am getting this error. I am not sure if pictures.yml file is correct in terms of the association. As always, any help would be greatly appreciated. Thanks!!
Aucun commentaire:
Enregistrer un commentaire