在 rails 中测试多态关联

testing polymorphic association in rails

我正在为 rails 应用程序中的图像更新编写测试。我的应用程序中的图片模型是一个多态关联,它属于多个模型。我正在测试集成测试中的创建、更新和销毁操作工作流。我已经成功测试了创建操作。它工作正常。我遇到的问题是更新操作。

下面给出图片模型的模型关联。

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

我通过拆分 url 来确定@​​pictureable 是用户还是记分牌。代码如下。

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

I 运行 a before_filter 该方法。 before_filter :load_pictureable.

在测试中,我不需要拆分任何 url。我特别说明 url 路径,scoreboard_picture_path 或 'user_picture_path'。我只需要通过 scoreboard_id 和 picture.id。错误状态为 update_attributes 为 nil class。我真的不确定为什么会收到此错误。我不确定 pictures.yml 文件在关联方面是否正确。一如既往,任何帮助将不胜感激。谢谢!!

在您的 yaml 中,您设置的是 pictureable_type 而不是 picturable_id,因此未正确建立关联。

您可以 see the fixtures docs 获取设置多态关联固定装置的示例,但基本上您应该能够执行以下操作,而不是您正在做的事情:

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

那应该允许 @pictureable.picture 到 return 图片。