小编A F*_*kly的帖子

Rails 4:验证id或关联的存在之间的区别

如果我在模型中有'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)都失败,并且煎饼缺少验证错误.)

validation ruby-on-rails model-associations ruby-on-rails-4

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

在requests.accepts中出现奇怪符号的Rails服务器错误:"[\"\\ xE2 \\ x80 \\ x8B/\\ xE2 \\ x80 \\ x8B \"]"

我经常喜欢清理通过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", …

format google-chrome ruby-on-rails ruby-on-rails-4 server

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

Ruby私有和公共访问器

在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的方式吗?

ruby access-modifiers accessor attr-accessor

5
推荐指数
3
解决办法
4163
查看次数

保存失败时的 rails 回调

在 Rails 5 中,我实现了一系列关系,这些关系在保存一个复杂模型时会导致鸡与蛋的问题。(需要 ID 来关联对象,但直到它们被保存后才存在。)

我需要以艰难的方式创建和保存对象,但如果保存失败,我需要自己清理,所以我最终不会得到一个充满空对象的数据库。

从模型中,当且仅当保存失败时,我如何确保我的清理代码运行?标准的回调列表似乎没有涵盖这种情况,除非我遗漏了一些东西。

ruby activerecord ruby-on-rails ruby-on-rails-5

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

在Ruby中,我需要将一个句子分成子句

鉴于字符串:

"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)

ruby arrays string

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