在 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 图片。
我正在为 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 图片。