首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何存根after_create回调保存!在模型中?

如何存根after_create回调保存!在模型中?
EN

Stack Overflow用户
提问于 2012-10-31 22:34:33
回答 1查看 3.4K关注 0票数 4

我收到以下错误:

输出:

代码语言:javascript
复制
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'

在标签模型中:

代码语言:javascript
复制
after_create :update_target

def update_target
   self.target.save!
end

测试:

代码语言:javascript
复制
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, attributes[:label], format: :json
      end
    end
  end
end

标记控制器:

代码语言:javascript
复制
  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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-31 23:23:55

从外观上看,数据库中没有ID为1的Target,因此在引用self.target时,返回值为nil。在您的例子中,我要做的是首先创建一个目标,然后将其id传递给属性散列:

代码语言:javascript
复制
target = Traget.create!
attributes = {
          label: {
            name: "test",
            labeling: {
              target_type: "Link", target_id: target.id
            }
          }
        }

这样,您不需要存根任何东西。如果您确实必须使用存根方法,则可以使用RSpecs any_instance方法:

代码语言:javascript
复制
Labeling.any_instance.stub(:update_target).and_return(true)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13160324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档