标签: ruby

Ruby mixins和调用超级方法

好吧,所以我一直在我的小Rails应用程序中重构我的代码以努力消除重复,并且通常使我的生活更轻松(因为我喜欢轻松的生活).这个重构的一部分,就是将我的两个模型共同的代码移动到一个模块,我可以在需要的地方包含它.

到现在为止还挺好.看起来它会成功,但我遇到了一个我不确定如何解决的问题.该模块(我称之为可发送模块)将成为处理传真,电子邮件或打印文档PDF的代码.因此,例如,我有一个采购订单,我有内部销售订单(富有想象力地缩写为ISO).

我遇到的问题是,我想要在加载对象后初始化一些变量(初始化为没有正确拼写的人:P),所以我一直在使用after_initialize钩子.没问题......直到我开始添加更多mixins.

我遇到的问题是,我可以after_initialize在任何一个mixin中有一个,所以我需要在开始时包含一个超级调用,以确保after_initialize调用其他mixin 调用.哪个好,直到我最终调用超级,我得到一个错误,因为没有超级调用.

这是一个小例子,如果我不够混淆:

class Iso < ActiveRecord::Base
  include Shared::TracksSerialNumberExtension
  include Shared::OrderLines
  extend  Shared::Filtered
  include Sendable::Model

  validates_presence_of   :customer
  validates_associated    :lines

  owned_by                :customer
  order_lines             :despatched # Mixin

  tracks_serial_numbers   :items  # Mixin

  sendable :customer                      # Mixin

  attr_accessor :address

  def initialize( params = nil )
    super
    self.created_at ||= Time.now.to_date
  end
end
Run Code Online (Sandbox Code Playgroud)

因此,如果每个mixin都有一个after_initialize调用,并且有一个超级调用,我该如何阻止最后一个超级调用引发错误?在调用super方法之前,如何测试super方法?

ruby ruby-on-rails

34
推荐指数
1
解决办法
3万
查看次数

如何在Ruby中生成n个唯一随机数的列表?

这是我到目前为止:

myArray.map!{ rand(max) }
Run Code Online (Sandbox Code Playgroud)

然而,显然,有时候列表中的数字并不是唯一的.如何确保我的列表只包含唯一的数字,而不必创建一个更大的列表,然后我从中选择n个唯一的数字?

编辑:
我真的很想看到这个完成w/o循环 - 如果可能的话.

ruby random

34
推荐指数
4
解决办法
3万
查看次数

颠倒ruby中数组的顺序

[12,16,5,9,11,5,4]打印了以下数组:12,16,5,9,11,5,4.

我想要它打印: 4,5,11,9,5,16,12

当我array.reverse打印时:

4,5,11,9,5,61,21
Run Code Online (Sandbox Code Playgroud)

它颠倒了个人数字 - 任何想法我怎么能阻止它?

ruby

34
推荐指数
4
解决办法
5万
查看次数

在postgresql应用程序的rails中运行迁移后的序列注释

当我在postgresql上的Rails应用程序中运行我的迁移时,我得到了以下通知

NOTICE:  CREATE TABLE will create implicit sequence "notification_settings_id_seq" for serial column "notification_settings.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "notification_settings_pkey" for table "notification_settings"
Run Code Online (Sandbox Code Playgroud)

我的迁移文件包含088_create_notification_settings.rb

class CreateNotificationSettings < ActiveRecord::Migration
  def self.up
    create_table :notification_settings do |t|
      t.integer :user_id
      t.integer :notification_id
      t.boolean :notification_on
      t.boolean :outbound
    end
  end

  def self.down
    drop_table :notification_settings
  end
end
Run Code Online (Sandbox Code Playgroud)

我想知道

这个通知意味着什么?

如何避免这种通知?

如果不避免,此类通知对应用程序的影响是什么?

问候,

萨里尔

ruby postgresql ruby-on-rails database-migration

34
推荐指数
2
解决办法
5320
查看次数

Ruby字符串到类名

我正在尝试创建一个新类,它将继承自ActiveRecord::Base需要从字符串动态生成的类

"general_systems".camelize.singularize = Class.new < ActiveRecord::Base
Run Code Online (Sandbox Code Playgroud)

但是我一直收到错误:

undefined method `singularize=' for "GeneralSystems":String
Run Code Online (Sandbox Code Playgroud)

我也尝试constantize过字符串

>> foo = "general_systems".camelize.singularize
=> "GeneralSystem"
>> foo.constantize
NameError: uninitialized constant GeneralSystem
    from /var/lib/gems/1.9.1/gems/activesupport-3.0.5/lib/active_support/inflector/methods.rb:124:in `block in constantize'
    from /var/lib/gems/1.9.1/gems/activesupport-3.0.5/lib/active_support/inflector/methods.rb:123:in `each'
    from /var/lib/gems/1.9.1/gems/activesupport-3.0.5/lib/active_support/inflector/methods.rb:123:in `constantize'
    from /var/lib/gems/1.9.1/gems/activesupport-3.0.5/lib/active_support/core_ext/string/inflections.rb:43:in `constantize'
    from (irb):4
    from /usr/bin/irb:12:in `<main>'
>> foo.constantize = Class.new
NoMethodError: undefined method `constantize=' for "GeneralSystem":String
    from (irb):5
    from /usr/bin/irb:12:in `<main>'
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激.

ruby metaprogramming

34
推荐指数
6
解决办法
3万
查看次数

Rspec让范围界定

我相信我有一个rspec let和范围问题.我可以在示例中使用let定义的方法("it"块),但不能在外面(我执行let的describe块).

5   describe Connection do
8     let(:connection) { described_class.new(connection_settings) }
9 
10    it_behaves_like "any connection", connection
24  end
Run Code Online (Sandbox Code Playgroud)

当我尝试运行此规范时,我收到错误:

connection_spec.rb:10:未定义的局部变量或类的方法`connection':0xae8e5b8(NameError)

如何将连接参数传递给it_behaves_like?

ruby rspec

34
推荐指数
4
解决办法
2万
查看次数

我可以在Ubuntu上使用apt-get安装gem吗?

我是Ruby的新手,只是潜水.Ruby教程说我应该从这里获得包装系统:http://rubyforge.org/frs/?group_id = 126

我在Ubuntu Linux上.该页面有一个.tar和一个.gem选项供下载.我应该下载哪个?

宝石是否与Java jar完全相似?如果我可以根据需要逐个下载宝石,为什么我需要宝石包装系统呢?

ruby ubuntu rubygems ruby-on-rails

34
推荐指数
4
解决办法
6万
查看次数

Date,Time和DateTime类是否必要?

当有一个可以同时处理这两个类的类时,拥有DateTime类的目的是什么DateTime

ruby

34
推荐指数
3
解决办法
8468
查看次数

在小写字母中生成带字母和数字的唯一随机字符串

如何修复此代码,以便以小写形式生成唯一的随机字母和数字?

api_string = (0...32).map{65.+(rand(25)).chr}.join    
Run Code Online (Sandbox Code Playgroud)

目前,它只生成字母.

ruby ruby-on-rails-3

34
推荐指数
3
解决办法
4万
查看次数

Rack :: Request - 如何获取所有标题?

标题非常明显.有没有办法获得标题(除了Rack::Request.env[])?

ruby rack http http-headers

34
推荐指数
3
解决办法
2万
查看次数