«Ошибка: невозможно открыть /home/‹›/billy-bones/= для чтения» при использовании pry и DataMapper

Итак, я пытаюсь создать быструю консольную программу для своих нужд разработки, похожую на 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

библиотека/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

библиотека/модель/категория.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

Если я заменю pry на irb в сценарии консоли, все пойдет нормально.

Большое спасибо!

П. С.

Хорошо, вчера я снова попробовал этот скрипт, и он отлично сработал. Я ничего не менял. Я не уверен, следует ли мне удалить вопрос сейчас или нет.

П. P.S.

Или на самом деле нет... Сегодня снова столкнулся с этим. Все еще совершенно не обращая внимания на то, что могло вызвать это.

** РЕШЕНО **

Черт тебя побери!

Итак, вот разница.

Когда я тестировал его во второй раз, я действительно ввел a = Category.new(name: 'TestCat', type: :referential), и это сработало. Похоже, pry просто думает, что cat — это команда Unix, а не допустимое имя переменной.


person art-solopov    schedule 27.07.2014    source источник


Ответы (1)


Не отвечаю на любопытный вопрос. Я просто ненавижу операторы case в 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

to:

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
person engineersmnky    schedule 28.07.2014
comment
Спасибо за предложение. Я просто не был уверен, что было «чище»: оператор case или self.send. - person art-solopov; 29.07.2014
comment
Операторы case @art-solopov обычно считаются запахом кода в ruby. Извините, я не мог помочь с реальной проблемой - person engineersmnky; 29.07.2014