加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 如何存根after_create回调保存!在模特?

发布时间:2020-12-17 02:03:09 所属栏目:百科 来源:网络整理
导读:我收到以下错误: 输出: 1) LabelsController#create label is new creates a new label Failure/Error: post :create,attributes[:label],format: :json NoMethodError: undefined method `save!' for nil:NilClass # ./app/models/labeling.rb:17:in `upd
我收到以下错误:

输出:

1) LabelsController#create label is new creates a new label
   Failure/Error: post :create,attributes[:label],format: :json
   NoMethodError:
     undefined method `save!' for nil:NilClass
   # ./app/models/labeling.rb:17:in `update_target'

在标签模型中:

after_create :update_target

def update_target
   self.target.save!
end

测试:

require 'spec_helper'
describe LabelsController do
  before(:each) do
    controller.stub(:current_user).and_return(mock_model(User))
    stub_request(:any,"www.example.com").to_return(status: 200)
  end
  describe "#create" do
    context "label is new" do
      it "creates a new label" do
        attributes = {
          label: {
            name: "test",labeling: {
              target_type: "Link",target_id: 1
            }
          }
        }
        response.status.should == 200
        post :create,format: :json
      end
    end
  end
end

贴标控制器:

def create
    label = Label.find_by_name(params[:name])

    labeling = label.labelings.build do |lb|
      lb.user_id     = current_user.id
      lb.target_type = params[:labeling][:target_type]
      lb.target_id   = params[:labeling][:target_id]
    end

    if labeling.save
      render json: {
        name: label.name,id: label.id,labeling: {
          id: labeling.id
        }
      }
    end
  end

解决方法

从它的外观来看,你没有数据库中ID为1的Target,所以在你引用self.target的地方,返回的值是nil.
我在你的情况下做的是首先创建一个目标,然后将其id传递给属性hash:

target = Traget.create!
attributes = {
          label: {
            name: "test",target_id: target.id
            }
          }
        }

这样你就不需要存根了.
如果你真的必须存根该方法,你可以使用RSpecs any_instance方法:

Labeling.any_instance.stub(:update_target).and_return(true)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读