【问题标题】:How to rspec join record in many-to-many in rails 3.1.0如何在rails 3.1.0中以多对多的方式加入记录
【发布时间】:2012-01-18 04:20:01
【问题描述】:

这是在 rfq 控制器中创建的:

  def create
    if has_create_right?
      @rfq = Rfq.new(params[:rfq], :as => :roles_new )
      #save into join table rfqs_standards
      params[:rfq][:standard_ids].each do |sid|
        @rfq.standards << Standard.find(sid.to_i) if !sid.nil?
      end
    if @rfq.save
        redirect_to URI.escape("/view_handler?index=0&msg=RFQ saved!")
      else
        flash.now[:error] = "RFQ not saved!"
        render 'new'
      end
    end
  end

这是 rspec 代码

  describe "'create'" do
    it "should be successful for corp head" do
      session[:corp_head] = true
      session[:user_id] = 1
      s = Factory(:standard)
      rfq = Factory.attributes_for(:rfq)
      rfq.standards << s
      get 'create', :rfq => rfq
      response.should redirect_to URI.escape("/view_handler?index=0&msg=RFQ saved!")
    end
  end

错误是:

  1) RfqsController 'create' should be successful for corp head
     Failure/Error: rfq.standards << s
     NoMethodError:
       undefined method `standards' for #<Hash:0x6741570>
     # ./spec/controllers/rfqs_controller_spec.rb:65:in `block (3 levels) in <top (requi

测试加入记录的正确方法是什么?谢谢。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3.1 rspec2


    【解决方案1】:

    从你的这部分测试:

        rfq = Factory.attributes_for(:rfq)
        rfq.standards << s
    

    看起来 rfq 是作为属性散列创建的,而不是完整的模型。您可以尝试像这样加入standard_ids:

    describe "'create'" do
      it "should be successful for corp head" do
        session[:corp_head] = true
        session[:user_id] = 1
        s = Factory(:standard)
        rfq = Factory.attributes_for(:rfq)
        rfq[:standard_ids] = [s.id] # attach standard_id's to mimic the POST'ed form data
        get 'create', :rfq => rfq
        response.should redirect_to URI.escape("/view_handler?index=0&msg=RFQ saved!")
      end
    end
    

    但是,您似乎可以使用嵌套属性来完成所有这些工作 - 请参阅 http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

    【讨论】:

    • 保存新的 rfq 时,应用程序保存到联接表中没有问题。现在的问题是如何重新规范它。这是一篇关于如何保存到联接表中的帖子 - stackoverflow.com/questions/8736805/…
    • 同意,但是我上面发布的代码不是如何保存模型,而是如何修复您的 RSpec 测试(我已经更新以使其更清晰)。关于嵌套属性的评论只是关于您如何实现连接模型的保存的评论/建议。你是对的,对于一个 habtm 关系,嵌套属性不会起作用,但不清楚你是在谈论你的 OP 中的一个 habtm。
    • 刚刚测试过,失败了。错误是:Failure/Error: get 'create', :rfq => rfq NoMethodError: You have an nil object when you didn't expect it!问题似乎是相同的,即 rfq (attributes_for) 不是对象。在 Rails 控制台中,如果 rfq 作为对象创建,则 rfq.standards
    • rfq[:standard_ids] = [s.id] 似乎是正确的方法。案子通过了。不知道为什么第一次没有通过。谢谢,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 2020-05-15
    • 1970-01-01
    相关资源
    最近更新 更多