如果我在模型中有'belongs_to'关联,我想知道验证关联之间的名义差异:
class Topping < ActiveRecord::Base
belongs_to :pancake
validates :pancake, presence: true
...
Run Code Online (Sandbox Code Playgroud)
并验证关联的模型ID:
class Topping < ActiveRecord::Base
belongs_to :pancake
validates :pancake_id, presence: true
...
Run Code Online (Sandbox Code Playgroud)
动机:
为煎饼分配顶部的一些代码在过去的某个时间停止了工作.将验证从关联更改为id'修复'问题,但我想知道更深层次的原因.
(仅供参考,当进入代码时,煎饼有效并且在数据库中,并且顶部响应两者.pancake并且.pancake_id相应.推送操作符(pancake.toppings << topping)和手动分配以及save(topping.pancake = pancake; topping.save)都失败,并且煎饼缺少验证错误.)
我经常喜欢清理通过Airbrake传来的500个错误.我正在生产Rails 4.2.4网站,我得到一个反复出现的错误,我发现它很令人费解.
错误是:
Missing partial shared/_rhs with {:locale=>[:en], :formats=>["\xE2\x80\x8B/\xE2\x80\x8B"], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :haml, :jbuilder]}.
查看Airbrake的env部分的错误,相关部分似乎是:
"action_dispatch.request.accepts": "[\"\\xE2\\x80\\x8B/\\xE2\\x80\\x8B\"]",
"action_dispatch.request.content_type": "",
"action_dispatch.request.flash_hash": "",
"action_dispatch.request.formats": "[\"\\xE2\\x80\\x8B/\\xE2\\x80\\x8B\"]",
看起来浏览器(自我识别为Chrome)要求一种无法识别的格式,但我不知道为什么会这样做.它似乎只是要求头部.
我可以忽略它,但如果有人有任何关于它为什么首先出现的想法,我会感兴趣.
完整的env(删除了标识内容项)是:
{
"DOCUMENT_ROOT": "[******]",
"HTTPS": "on",
"HTTP_ACCEPT": "?/?",
"HTTP_ACCEPT_ENCODING": "gzip,deflate,sdch",
"HTTP_ACCEPT_LANGUAGE": "en-US,en;q=0.8",
"HTTP_CACHE_CONTROL": "no-cache",
"HTTP_CONNECTION": "keep-alive",
"HTTP_HOST": "[******]",
"HTTP_PRAGMA": "no-cache",
"HTTP_USER_AGENT": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.49 Safari/537.36",
"ORIGINAL_FULLPATH": "[******]",
"ORIGINAL_SCRIPT_NAME": "",
"PASSENGER_APP_ENV": "live",
"PASSENGER_APP_TYPE": "rack",
"PASSENGER_SHOW_VERSION_IN_HEADER": "false",
"PATH_INFO": "[******]",
"QUERY_STRING": "",
"REMOTE_ADDR": "[******]",
"REMOTE_PORT": "47888", …
在Ruby中定义访问器时,简洁(我们都喜欢)和最佳实践之间可能存在紧张关系.
例如,如果我想在实例上公开一个值但禁止任何外部对象更新它,我可以执行以下操作:
class Pancake
attr_reader :has_sauce
def initialize(toppings)
sauces = [:maple, :butterscotch]
@has_sauce = toppings.size != (toppings - sauces).size
...
Run Code Online (Sandbox Code Playgroud)
但突然间我正在使用一个原始实例变量,这让我抽搐了.我的意思是,如果我需要在未来某一日期设定之前处理has_sauce,我可能需要做更多的重构不仅仅是重写访问.来吧,原始实例变量?布莱什.
我可以忽略这个问题并使用它attr_accessor.我的意思是,任何人都可以设置属性,如果他们真的想要; 毕竟,这就是Ruby.但后来我失去了数据封装的想法,对象的界面定义不太明确,系统可能更混乱.
另一种解决方案是在不同的访问修饰符下定义一对访问器:
class Pancake
attr_reader :has_sauce
private
attr_writer :has_sauce
public
def initialize(toppings)
sauces = [:maple, :butterscotch]
self.has_sauce = toppings.size != (toppings - sauces).size
end
end
Run Code Online (Sandbox Code Playgroud)
这完成了工作,但对于一个简单的存取器而言,这是一大块样板,而且非常坦率地说:ew.
那么有更好的,更Ruby的方式吗?
在 Rails 5 中,我实现了一系列关系,这些关系在保存一个复杂模型时会导致鸡与蛋的问题。(需要 ID 来关联对象,但直到它们被保存后才存在。)
我需要以艰难的方式创建和保存对象,但如果保存失败,我需要自己清理,所以我最终不会得到一个充满空对象的数据库。
从模型中,当且仅当保存失败时,我如何确保我的清理代码运行?标准的回调列表似乎没有涵盖这种情况,除非我遗漏了一些东西。
鉴于字符串:
"See Spot Run"
Run Code Online (Sandbox Code Playgroud)
我需要返回一个数组:
[ "See", "Spot", "run", "See Spot", "Spot run", "See Spot Run" ]
Run Code Online (Sandbox Code Playgroud)
到目前为止,我有:
term = "The cat sat on the mat"
#=> "The cat sat on the mat"
arr = term.split(" ")
#=> ["The", "cat", "sat", "on", "the", "mat"]
arr.length.times.map { |i| (arr.length - i).times.map { |j| arr[j..j+i].join(" ") } }.flatten(1)
#=> ["The", "cat", "sat", "on", "the", "mat", "The cat", "cat sat", "sat on", "on the", "the mat", "The cat sat", "cat sat on", "sat …Run Code Online (Sandbox Code Playgroud)