我正在编写测试以更新我的rails应用程序中的图像。我的应用程序中的图片模型是一个多态关联,它属于多个模型。我正在测试集成测试中的创建,更新和销毁操作工作流程。我已经成功测试了创建动作。它的工作正常。我遇到的问题是更新操作。
模型与图片模型的关联如下。
--count
picture_update_test的代码如下所示。
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.yml文件中的代码如下所示。
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_a:
picture: "blank-prof.jpg"
pictureable_type: scoreboard
图片控制器代码也在下面给出。
NoMethodError: undefined method `update_attributes' for nil:NilClass
app/controllers/pictures_controller.rb:19:in `update'
我通过拆分网址找出@pictureable是用户还是记分板。代码如下。
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
我为该方法运行了一个before_filter。 def load_pictureable
resource, id = request.path.split('/')[1,2]
@pictureable = resource.singularize.classify.constantize.find(id)
end
。
在测试中,我不需要拆分任何网址。我具体说明了url路径before_filter :load_pictureable
或'user_picture_path'。我只需要传递scoreboard_id和picture.id。该错误表示nil类的update_attributes。我真的不确定为什么我会收到这个错误。我不确定pictures.yml文件在关联方面是否正确。一如既往,任何帮助将不胜感激。谢谢!
答案 0 :(得分:2)
In your yaml
you're setting pictureable_type
but not picturable_id
and so the association is not being built correctly.
You can see the fixtures docs for examples of setting up polymorphic association fixtures, but basically instead of what you're doing you should be able to do something like:
picture_a:
picture: "blank-prof.jpg"
pictureable: scoreboard_a (Scoreboard)
That should then allow @pictureable.picture
to return the picture.