相关疑难解决方法(0)

在Rails中,如何向String类添加新方法?

我想在我的Rails项目中为不同的对象构建一个索引,并希望添加一个'count_occurences'方法,我可以在String对象上调用它.

我看到我可以做类似的事情

class String
  def self.count_occurences
    do_something_here
  end
end
Run Code Online (Sandbox Code Playgroud)

定义此方法的确切方法是什么,以及将代码放在我的Rails项目中的位置?

谢谢

ruby monkeypatching ruby-on-rails-3

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

在Ruby on Rails表单中输入数字时的小数和逗号

在表单中输入数字时,允许用户使用小数或逗号的最佳Ruby/Rails方法是什么?换句话说,我希望用户能够在我的数据库中输入2,000.99而不是2.00.

这是最好的做法吗?

- 更新---

gsub可以与浮点数或大整数一起使用吗?或者,当将浮动或整体输入表格时,轨道会自动切断数字吗?我尝试使用self.price.gsub(",","")但得到"未定义的方法`gsub'为8:Fixnum",其中8是我在表单中输入的任何数字.

ruby-on-rails decimal biginteger comma ruby-on-rails-3

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

如何在Rails中扩展类Object?

我想nil_or_empty?为所有类添加方法,因此我定义

module ObjectExtensions
  def nil_or_empty?
    return self.nil? || (self.respond_to?('empty?') && self.empty?)
  end
end
::Object.class_eval { include ::ObjectExtensions }
Run Code Online (Sandbox Code Playgroud)

它在一个简单的Ruby脚本中工作正常

p nil.nil_or_empty? #=> true
p ''.nil_or_empty? #=> true
p [].nil_or_empty? #=> true
p 0.nil_or_empty? #=> false
Run Code Online (Sandbox Code Playgroud)

但是,当我lib/extensions.rb在Rails 3应用程序中将其添加到我的库文件时,似乎没有添加

NoMethodError (undefined method `nil_or_empty?' for nil:NilClass):
  app/controllers/application_controller.rb:111:in `before_filter_test'
Run Code Online (Sandbox Code Playgroud)

我加载库文件(该文件中的所有其他扩展都正常工作)和

# config/application.rb
# ...
config.autoload_paths << './lib'
Run Code Online (Sandbox Code Playgroud)

我哪里错了?

ruby ruby-on-rails object

6
推荐指数
2
解决办法
5545
查看次数

为什么在 Rails 中使用 /app/lib 而不是 /lib?

在 sidekiq 文档中,有一段关于在与自动加载错误相关的 Rails 项目中更喜欢使用而不是使用的引用/app/lib/lib

lib/ 目录只会引起痛苦。将代码移动到 app/lib/ 并确保里面的代码遵循类/文件名约定。

此外,还有:

不要在 autoload_paths 或eager_load_paths 中配置额外的路径。这是一个黑客;遵守约定!app/ 下的任何目录都可能包含 Ruby 代码,您无需显式配置任何内容。

我的问题是:

这些陈述是否有道理,即使用/app/lib比使用更好/lib

这是否仅有助于自动加载 Rails 相关的对象(例如 AR 模型、控制器、作业等)?或者它也会帮助 PORO?

这些评论是否只有特定的上下文才有意义?

ruby ruby-on-rails sidekiq

5
推荐指数
1
解决办法
1244
查看次数

Rails 6 with Zeitwerk:如何扩展 Ruby 核心类,如日期、时间、字符串等

我正在将 Rails 5.2.2 升级到现在具有Zeitwerk 的Rails 6.0.0 。

以前我已经扩展了核心 ruby​​ 类,如日期、时间、字符串、浮点数等,如本问题所述。使用初始化文件加载文件lib/core_ext/*夹中的所有文件。启动时,rails server它现在错误堆栈跟踪的最后一行读取:

/home/username/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/zeitwerk-2.1.10/lib/zeitwerk/loader.rb:351:in `const_get': uninitialized constant CoreExt::Date (NameError)
Run Code Online (Sandbox Code Playgroud)

不幸的是,Zeitwerk 导致了一个错误,其中lib/core_ext/date.rbetc 抛出了一个已经定义的错误(当Rails.autoloaders.log!application.rb.CoreExt::Date

我已经将文件直接移动到initializers(以前我只有初始化器目录,其中包含一个从'lib/core_ext/*文件夹加载每个文件的文件)。这暂时解决了这个问题,但我想将core_ext文件夹和文件保留在原来的位置。

我在这里错过了什么?

lib/core_ext/date.rb

/home/username/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/zeitwerk-2.1.10/lib/zeitwerk/loader.rb:351:in `const_get': uninitialized constant CoreExt::Date (NameError)
Run Code Online (Sandbox Code Playgroud)

我试过明确包装,CoreExt但这没有帮助。

module CoreExt
  class Date
    def to_sap
      strftime('%d.%m.%Y')
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails ruby-on-rails-6

5
推荐指数
2
解决办法
1260
查看次数

在 Rails 应用程序中扩展哈希类

我有一个 Rails 应用程序,我需要扩展模块Hash以添加方法 -

class Hash
  def delete_blank
    delete_if{|k, v| v.nil? or (v.instance_of?(Hash) and v.delete_blank.empty?)}
  end
end
Run Code Online (Sandbox Code Playgroud)

我创建了一个名为 hash_extensions.rb 的文件,并将其放置在我的 lib 文件夹中,当然还使用以下行配置了自动加载路径config/application.rb

config.autoload_paths += %W(#{config.root}/lib) 
Run Code Online (Sandbox Code Playgroud)

然而,当我在哈希上调用删除空白方法时,出现以下错误 -

undefined method `delete_blank' for #<Hash:0x000000081ceed8>\nDid you mean?  delete_if
Run Code Online (Sandbox Code Playgroud)

除此之外,我还尝试将其放置require "hash_extensions"在我从中调用delete_blank方法的文件顶部。

我在这里做错了什么或者我可以避免扩展哈希以具有相同的功能吗?

hash ruby-on-rails

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

Rails扩展Date类

我创建了一个使用方法lib/ext/date.rb扩展Date类的文件.

class Date
  def self.next_ weekday_string
    // code here
  end
end
Run Code Online (Sandbox Code Playgroud)

在我的application.rb文件中,我自动加载此ext文件夹中的所有内容

config.autoload_paths << "#{Rails.root}/lib/ext"
Run Code Online (Sandbox Code Playgroud)

但我一直在收到错误 undefined method next_ for Date:Class

从控制台内调用此方法可以正常工作

load 'lib/ext/date.rb'; Date.next_ 'wednesday'
=> Wed, 07 Oct 2015
Run Code Online (Sandbox Code Playgroud)

是的,在尝试使用此扩展方法之前,服务器已重新启动.

ruby ruby-on-rails

1
推荐指数
1
解决办法
290
查看次数