我没有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?
我希望我的用户模型在保存之前清理一些输入.现在一些简单的空白剥离就可以了.因此,为了避免人们注册"哈利"并假装成"哈利",例如.
我认为在验证之前进行这种剥离是个好主意,这样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").
编辑:正如评论中所指出的,我的代码是错误的(这就是我问问题的原因).除了我的问题之外,请确保您阅读接受的答案以获取正确的代码,并避免我犯的错误.
PHP中是否存在一种NotImplementedError?
我想将这些添加到一些存根方法和接口,以便警告扩展我的类,他们仍然有工作要做.或者这在PHP中有所不同?
我有一个包含载波上传的图片:
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的路径最干净,最好的方法是什么?
为了研究前一次提交所引入的效果,我想将其反向应用到我的工作副本并使用代码.
我通过创建和应用补丁的工作流程进行了管理,但是想知道这是否可以更轻松地完成.
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 revert或git rebase -i因为这些会引入新的提交或更改历史记录:我只是希望引入的更改d9fd2bb不适用于我当前的工作副本.
我正在使用的库和Web服务以ISO 8601格式PnYnMnDTnHnMnS传送时间间隔:.我想将这些格式转换为秒.反之亦然.使用秒数更容易计算.
示例间隔值为:
我需要两个函数:从这些值解析为秒:iso8601_interval_to_seconds()以及从秒到这样的间隔:iso8601_interval_from_seconds().
后者相当简单,因为它可以作为"PT {$ seconds} S"完成,只需要在几秒钟内完成.也许这可以通过切换到H(小时)或M(分钟)的解析器更好地完成?
第一个更难,但也许有一个技巧与PHP中的许多字符串到今天的转换器之一?我很想学习如何使用这样的函数来解析间隔.或者学习另一种选择.
在我的控制器中,我有以下简化代码:
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已经定义了常量.它是否正确?该怎么办呢?
是否有现有命令,或某些技巧或脚本允许我显示"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状态信息.
将记录添加到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中此类问题的首选方式?
我经常需要抛出一个自定义(错误)错误.就像由于参数不匹配而无法找到资源时.
我更喜欢抛出现有错误,或抛出从现有错误继承的错误.这样,我不会引入已经定义的错误类,并且可以完美地使用(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中是否有可用的错误类列表?有没有办法为您当前的项目获得这样的列表?
重新使用和/或继承现有错误是否很聪明,或者我应该维护自己的自定义设置?