小编ber*_*kes的帖子

是否存在用于not_nil的Ruby或Ruby-ism?零对面?方法?

我没有Ruby经验,所以我的代码感觉"丑陋"而不是惯用语:

def logged_in?
  !user.nil?
end
Run Code Online (Sandbox Code Playgroud)

我宁愿有类似的东西

def logged_in?
  user.not_nil?
end
Run Code Online (Sandbox Code Playgroud)

但找不到这样一种对立的方法 nil?

ruby null ruby-on-rails

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

Rails before_validation剥离空白最佳实践

我希望我的用户模型在保存之前清理一些输入.现在一些简单的空白剥离就可以了.因此,为了避免人们注册"哈利"并假装成"哈利",例如.

我认为在验证之前进行这种剥离是个好主意,这样validates_uniqueness_of可以避免意外的重复.

class User < ActiveRecord::Base
  has_many :open_ids

  validates_presence_of :name
  validates_presence_of :email
  validates_uniqueness_of :name
  validates_uniqueness_of :email
  validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i

  before_validation :strip_whitespace, :only => [:name, :email, :nick]

  private
  def strip_whitespace(value)
    value.responds_to?('strip') ? value.strip : value
  end
end
Run Code Online (Sandbox Code Playgroud)

但是,此代码附带错误ArgumentError:错误的参数数量(0表示1).我假设回调将传递值.

另外:这个剥离实际上是个好主意吗?或者我应该在空间上验证并告诉用户"Harry"包含无效的spacess(我想允许"Harry Potter"而不是"Harry\s\sPotter").

编辑:正如评论中所指出的,我的代码是错误的(这就是我问问题的原因).除了我的问题之外,请确保您阅读接受的答案以获取正确的代码,并避免我犯的错误.

validation model ruby-on-rails

54
推荐指数
12
解决办法
4万
查看次数

在PHP中抛出NotImplementedError?

PHP中是否存在一种NotImplementedError?

我想将这些添加到一些存根方法和接口,以便警告扩展我的类,他们仍然有工作要做.或者这在PHP中有所不同?

php exception

53
推荐指数
1
解决办法
2万
查看次数

Rails 3中图像路径的完整URL

我有一个包含载波上传的图片:

Image.find(:first).image.url #=> "/uploads/image/4d90/display_foo.jpg"
Run Code Online (Sandbox Code Playgroud)

在我看来,我想找到这个绝对的网址.追加root_url会导致双倍/.

root_url + image.url #=> http://localhost:3000//uploads/image/4d90/display_foo.jpg
Run Code Online (Sandbox Code Playgroud)

我不能使用url_for(我知道的),因为这要么允许传递的路径,或者选项标识资源和列表:only_path选项.由于我没有可通过"controller"+"action"识别的资源,因此我无法使用该:only_path选项.

url_for(image.url, :only_path => true) #=> wrong amount of parameters, 2 for 1
Run Code Online (Sandbox Code Playgroud)

在Rails3中创建一个完整URL的路径最干净,最好的方法是什么?

ruby url ruby-on-rails path ruby-on-rails-3

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

反向将提交应用于工作副本

为了研究前一次提交所引入的效果,我想将其反向应用到我的工作副本并使用代码.

我通过创建和应用补丁的工作流程进行了管理,但是想知道这是否可以更轻松地完成.

git checkout -b "tmp-fiddle"
git diff -R -p d9fd2bb^ d9fd2bb > patch_to_examine.patch
# Manually edit the patch a little
git apply patch_to_examine.patch
Run Code Online (Sandbox Code Playgroud)

请注意,我没有查看git revertgit rebase -i因为这些会引入新的提交或更改历史记录:我只是希望引入的更改d9fd2bb不适用于我当前的工作副本.

git revert

31
推荐指数
2
解决办法
8488
查看次数

解析并创建ISO 8601日期和时间间隔,如PHP中的PT15M

我正在使用的库和Web服务以ISO 8601格式PnYnMnDTnHnMnS传送时间间隔:.我想将这些格式转换为秒.反之亦然.使用秒数更容易计算.

示例间隔值为:

  • PT1M或PT60S(1分钟)
  • PT1H,PT60M或PT3600S(1小时)

我需要两个函数:从这些值解析为秒:iso8601_interval_to_seconds()以及从秒到这样的间隔:iso8601_interval_from_seconds().

后者相当简单,因为它可以作为"PT {$ seconds} S"完成,只需要在几秒钟内完成.也许这可以通过切换到H(小时)或M(分钟)的解析器更好地完成?

第一个更难,但也许有一个技巧与PHP中的许多字符串到今天的转换器之一?我很想学习如何使用这样的函数来解析间隔.或者学习另一种选择.

php date iso8601 intervals

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

在Ruby on Rails中使用结构体提供动态常量赋值(SyntaxError)

在我的控制器中,我有以下简化代码:

def index
  @dashboard_items = []
  DashItem = Struct.new(:name, :amount, :moderated)  # Error is here

  [:page, :post].each do |c|
    obj = c.to_s.capitalize.constantize
    @dashboard_items << DashItem.new(c.to_s, obj.count, obj.count_moderated)
  end
end
Run Code Online (Sandbox Code Playgroud)

但是Ruby给出了以下错误:

动态常量赋值(SyntaxError)

在上面标出的线上.

其中,AFAIK,意味着DashItem已经定义了常量.它是否正确?该怎么办呢?

ruby struct

24
推荐指数
2
解决办法
1万
查看次数

用git状态信息增强"ls"?

是否有现有命令,或某些技巧或脚本允许我显示"ls"中显示的文件的状态?

类似于以下内容:

$ git ls status #Command could be anything `lsg` is fine too, whatever.

app           contents modified
autotest      up-to-date
config        up-to-date
config.ru     staged
db            contents modified
doc           contents modified
Gemfile       modified
Gemfile.lock  modified
lib           up-to-date
log           up-to-date
public        up-to-date
Rakefile      up-to-date
README        up-to-date
script        up-to-date
spec          up-to-date
tmp           up-to-date
vendor        contents modidified
test.tmp      removed
Run Code Online (Sandbox Code Playgroud)

以任何方式:在目录列表中提供git状态信息.

git

24
推荐指数
3
解决办法
2940
查看次数

如何在新的has_many关联上创建ActiveRecord bump updated_at

将记录添加到has_many关联并保存父级时,该父级updated_at不会被碰撞:

order = Order.new
order.save
pp order
  => #<Order id: 3, created_at: "2013-04-18 15:25:09", updated_at: "2013-04-18 15:25:09"> 
order.line_items << LineItem.new()
pp order.line_items
  => [#<LineItem id: 4, order_id: 3, created_at: "2013-04-18 15:26:16", updated_at: "2013-04-18 15:26:29", product_id: 123>] 
order.save
pp order.reload
  => #<Order id: 3, created_at: "2013-04-18 15:25:09", updated_at: "2013-04-18 15:25:09">
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为Order它没有触及; 外键生活在LineItem.

但是,在这种情况下,我想查询Order并查找在过去30分钟内Order收到新LineItems的s(即:在过去30分钟内"更新").

我不确定这里最好做什么,以及如何轻松实现这一目标.是否有一些我可以设置的标志或方法让AR更新父母updated_at如上所述?或者我应该通过一些钩子来做到这一点?如果是这样,什么挂钩?或者我应该将此时间戳存储在不同的列中?

请注意,我可以查询line_items.updated_at槽a join(:line_items),但这可能会使我的代码更混乱,性能更差:或者这是Rails中此类问题的首选方式?

activerecord ruby-on-rails

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

获取现有Rails错误类的列表以供重用/继承

我经常需要抛出一个自定义(错误)错误.就像由于参数不匹配而无法找到资源时.

我更喜欢抛出现有错误,或抛出从现有错误继承的错误.这样,我不会引入已经定义的错误类,并且可以完美地使用(DRY).但它也允许保持措辞和风格相同,通过继承和简单地改变一两个字来澄清与原始错误的差异.

例如:

Foo.new
Foo.some_external_id = nil
Foo.fetch_external_resource
# => InvalidOptions: Calling Foo#fetch_external_resource with nil is invalid
Run Code Online (Sandbox Code Playgroud)

我很确定已经定义了这样的错误.事实上,在通过多行代码阅读后,我发现我的MongoID驱动程序已经存在Mongoid::Errors::InvalidOptions: Calling Document#find with nil is invalid.

Ruby Core和Ruby on Rails中是否有可用的错误类列表?有没有办法为您当前的项目获得这样的列表?

重新使用和/或继承现有错误是否很聪明,或者我应该维护自己的自定义设置?

error-handling custom-exceptions ruby-on-rails-3

21
推荐指数
3
解决办法
8922
查看次数