'错误:使用pry和DataMapper时无法打开“/home/<...>/billy-bones/=”进行阅读

时间:2014-07-27 22:26:06

标签: ruby sinatra ruby-datamapper pry

所以,我正在尝试为我的开发需求构建一个快速控制台程序,类似于rails console(我使用的是Sinatra + DataMapper + pry)。

我运行它并启动cat = Category.new(name: 'TestCat', type: :referential)。它给了我以下错误:

Error: Cannot open "/home/art-solopov/Projects/by-language/Ruby/billy-bones/=" for reading.

问题可能是什么原因?

控制台:

#!/usr/bin/env ruby
$LOAD_PATH << 'lib'

require 'pry'
require 'config'

binding.pry

LIB / config.rb:

# Configuration files and app-wide requires go here

require 'sinatra'
require 'data_mapper'
require 'model/bill'
require 'model/category'
configure :production do
  DataMapper::Logger.new('db-log', :debug)
  DataMapper.setup(:default,
    'postgres://billy-bones:billy@localhost/billy-bones')
  DataMapper.finalize
end

configure :development do
  DataMapper::Logger.new($stderr, :debug)
  DataMapper.setup(:default,
    'postgres://billy-bones:billy@localhost/billy-bones-dev')
  DataMapper.finalize
  DataMapper.auto_upgrade!
end

configure :test do
  require 'dm_migrations'
  DataMapper::Logger.new($stderr, :debug)
  DataMapper.setup(:default,
    'postgres://billy-bones:billy@localhost/billy-bones-test')
  DataMapper.finalize
  DataMapper.auto_migrate!
end

LIB /模型/ category.rb:

require 'data_mapper'

class Category
    include DataMapper::Resource

    property :id, Serial
    property :name, String
    property :type, Enum[:referential, :predefined, :computable]

    has n, :bills
    # has n, :tariffs TODO uncomment when tariff ready

    def create_bill(params)
      # A bill factory for current category type
      case type
      when :referential
        ReferentialBill.new params
      when :predefined
        PredefinedBill.new params
      when :computable
        ComputableBill.new params
      end
    end

end

如果我用控制台脚本中的irb替换pry,那就没事了。

非常感谢!

P上。 S上。

好的,昨天我再次尝试了这个脚本,它运行得很好。我没有改变任何事情。我不确定我现在是否应该删除这个问题。

P上。 P. S.

或者实际上不是......今天我又遇到了它。仍然完全没有注意到可能导致它的原因。

**已解决**

诅咒你!

好的,差异就是这样。

当我第二次测试它时,我实际上输入了a = Category.new(name: 'TestCat', type: :referential)并且它有效。看起来pry只是认为cat是Unix命令,而不是有效的变量名。

1 个答案:

答案 0 :(得分:0)

不回答撬问题我只是讨厌ruby中的案例陈述。

为什么不改变:

def create_bill(params)
  # A bill factory for current category type
  case type
  when :referential
    ReferentialBill.new params
  when :predefined
    PredefinedBill.new params
  when :computable
    ComputableBill.new params
  end
end

为:

def create_bill(params)
  # A bill factory for current category type
  self.send("new_#{type}_bill",params)
end
def new_referential_bill(params)
  ReferentialBill.new params
end
def new_predefined_bill(params)
  PredefinedBill.new params
end
def new_computable_bill(params)
  ComputableBill.new params
end

你可以让它变得更有活力,但我认为在这种情况下这会带来可读性,但是如果你想在rails中这样做就应该这样做

def create_bill(params)
  if [:referential, :predefined, :computable].include?(type)
    "#{type}_bill".classify.constantize.new(params)
  else
    #Some Kind of Handling for non Defined Bill Types
  end
end

或者这可以在rails

内部或外部使用
def create_bill(params)
  if [:referential, :predefined, :computable].include?(type)
    Object.const_get("#{type.to_s.capitalize}Bill").new(params)
  else
    #Some Kind of Handling for non Defined Bill Types
  end
end