Paperclip Shoulda Matcher错误(未定义方法`gsub'对于nil:NilClass)

时间:2014-07-10 18:54:02

标签: ruby-on-rails ruby ruby-on-rails-4 paperclip paperclip-validation

我有一个非常奇怪的问题,测试通过并随机失败。意思是,有时它会过去,有时它会失败。使用shoulda-matcher(https://github.com/thoughtbot/paperclip)的paperclip-matchers(https://github.com/thoughtbot/shoulda-matchers)存在问题。

假设我有一个像这样写的模型:

class Import < ActiveRecord::Base
  has_attached_file :document
  validates_attachment :document, presence: true,
                       content_type: { content_type: ['application/vnd.ms-excel', 'application/csv', 'text/csv'] }
end

这样写的测试:

require 'spec_helper'   

describe Import do
  it { should have_attached_file(:document) }
  it { should validate_attachment_presence(:document) }
  it { should validate_attachment_content_type(:document).
    allowing('application/vnd.ms-excel', 'application/csv', 'text/csv') }
end

我得到的错误是:

Failures:   

  1) Import should require presence of attachment document
     Failure/Error: it { should validate_attachment_presence(:document) }
     NoMethodError:
       undefined method `gsub' for nil:NilClass
     # ./spec/models/import_spec.rb:14:in `block (2 levels) in <top (required)>'

我一直在谷歌搜索这个,我似乎无法弄清楚它为什么会破碎。我只是使用回形针匹配器,根据我的spec_helper.rb中的文档我已经正确使用了

有没有人遇到过这个问题?

谢谢!

编辑:

最后得到了回溯,除了这次发生了不同的模型。这是回溯。回形针匹配器与最新版本的rspec不兼容似乎是一个问题。有没有遇到过这个问题,并且可能有一个可以为这个特定问题建议的解决方法?

   1) Element should require presence of attachment attachment
      Failure/Error: it { should validate_attachment_presence :attachment }
      NoMethodError:
        undefined method `gsub' for nil:NilClass
      # /usr/local/lib/ruby/gems/1.9.1/gems/paperclip-4.2.0/lib/paperclip/io_adapters/abstract_adapter.rb:23:in `original_filename='
      # /usr/local/lib/ruby/gems/1.9.1/gems/paperclip-4.2.0/lib/paperclip/io_adapters/stringio_adapter.rb:13:in `cache_current_values'
      # /usr/local/lib/ruby/gems/1.9.1/gems/paperclip-4.2.0/lib/paperclip/io_adapters/stringio_adapter.rb:5:in `initialize'
      # /usr/local/lib/ruby/gems/1.9.1/gems/paperclip-4.2.0/lib/paperclip/io_adapters/registry.rb:29:in `new'
      # /usr/local/lib/ruby/gems/1.9.1/gems/paperclip-4.2.0/lib/paperclip/io_adapters/registry.rb:29:in `for'
      # /usr/local/lib/ruby/gems/1.9.1/gems/paperclip-4.2.0/lib/paperclip/attachment.rb:96:in `assign'
      # /usr/local/lib/ruby/gems/1.9.1/gems/paperclip-4.2.0/lib/paperclip/matchers/validate_attachment_presence_matcher.rb:48:in `no_error_when_valid?'
      # /usr/local/lib/ruby/gems/1.9.1/gems/paperclip-4.2.0/lib/paperclip/matchers/validate_attachment_presence_matcher.rb:22:in `matches?'
      # /usr/local/lib/ruby/gems/1.9.1/gems/rspec-expectations-3.0.2/lib/rspec/expectations/handler.rb:48:in `handle_matcher'
      # /usr/local/lib/ruby/gems/1.9.1/gems/rspec-core-3.0.2/lib/rspec/core/memoized_helpers.rb:81:in `should'
      # /usr/local/lib/ruby/gems/1.9.1/gems/rspec-core-3.0.2/lib/rspec/core/runner.rb:112:in `block (2 levels) in run_specs'
      # /usr/local/lib/ruby/gems/1.9.1/gems/rspec-core-3.0.2/lib/rspec/core/runner.rb:112:in `map'
      # /usr/local/lib/ruby/gems/1.9.1/gems/rspec-core-3.0.2/lib/rspec/core/runner.rb:112:in `block in run_specs'
      # /usr/local/lib/ruby/gems/1.9.1/gems/rspec-core-3.0.2/lib/rspec/core/reporter.rb:54:in `report'
      # /usr/local/lib/ruby/gems/1.9.1/gems/rspec-core-3.0.2/lib/rspec/core/runner.rb:108:in `run_specs'
      # /usr/local/lib/ruby/gems/1.9.1/gems/rspec-core-3.0.2/lib/rspec/core/runner.rb:86:in `run'
      # /usr/local/lib/ruby/gems/1.9.1/gems/rspec-core-3.0.2/lib/rspec/core/runner.rb:70:in `run'
      # /usr/local/lib/ruby/gems/1.9.1/gems/rspec-core-3.0.2/lib/rspec/core/runner.rb:38:in `invoke'
      # /usr/local/lib/ruby/gems/1.9.1/gems/rspec-core-3.0.2/exe/rspec:4:in `<top (required)>'
      # /usr/local/bin/rspec:23:in `load'
      # /usr/local/bin/rspec:23:in `<main>'

2 个答案:

答案 0 :(得分:0)

I found the answer here

  

然而,有一个小小的音符,我不相信会被回应   回形针宝石自述文件,表明符号可以传递给   引用实例方法的path属性。移动我的代码   从lambda到公共私有方法,并使用该方法名称   因为传递给path属性的值就像魅力一样。

:path => :path_to_file


def path_to_file
  return "/system/#{sub_domain}/:class/:id/:basename.:extension"
end

private
  def sub_domain
    ...code to get to the sub_domain of the school
  end

答案 1 :(得分:0)

我实际上是通过使用paperclip的master分支解决了这个问题。这有点奇怪,因为版本号看起来是一样的。所以基本上,在Gemfile中:

gem "paperclip", git: "git://github.com/thoughtbot/paperclip.git"