【问题标题】:Conditional Active Record Callbacks条件活动记录回调
【发布时间】:2016-06-03 09:07:31
【问题描述】:

以下geocodes(获取地址的坐标)在我创建或更新时自动进行。这是在我的位置模型中

def full_address
    full_address = "#{address},#{city},#{state}"
end

geocoded_by :full_address
after_validation :geocode, :if => :address_changed?

但如果我将 coords_locked 设置为 true,我不希望完成地理编码。

我不知道该怎么做。我试过了

geocoded_by :full_address
  after_validation :geocode, :if => { :coords_locked == false || :address_changed?  }

什么是正确的语法,或者我要解决这一切都错了。谢谢

附言。刚刚意识到我可能不需要full_address =

【问题讨论】:

  • 此外,如果您尝试按照您的要求执行此操作:after_validation :geocode, :if => !coords_locked || :address_changed?
  • 我让自己陷入双重否定,但如果 :coords_locked 为假,我确实想要设置坐标。如果coords_lockedtrue,这意味着我不希望进行更改。但更重要的是,如果没有冒号的语法 !coords_locked 效果很好,因为我想我尝试了 !: 并得到了错误。我会试试这个然后回来。
  • after_validation :geocode, :if => !:coords_locked && :address_changed? 无论:coords_lockedtrue 还是false undefined method `after_validation' for false: FalseClass def update respond_to do |format| 的结果如下if @location.update(location_params) # 如果更新成功,重定向到展示页面 format.html { redirect_to @location, notice: '地址更新成功。' } format.json { render :show, status: :ok, location: @location } 这是股票控制器语言。
  • 该!负数不起作用,所以为了测试我尝试了after_validation :geocode, :if => :coords_locked? && :address_changed? 并且没有错误地运行。除了它改变了coords_lockedtrue 还是false 的坐标。

标签: ruby-on-rails activerecord conditional


【解决方案1】:

我认为您需要 Rails 指南中的以下内容 - http://guides.rubyonrails.org/active_record_validations.html#using-a-proc-with-if-and-unless

5.3 使用带有 :if 和 :unless 的 Proc

最后,可以将 :if 和 :unless 与将被调用的 Proc 对象相关联。使用 Proc 对象使您能够编写内联条件而不是单独的方法。此选项最适合单行。

所以也许是这样的:

  after_validation :geocode,
    if: Proc.new { |location| location.coords_locked? && location.address_changed? }

那么您也许可以设置一些范围来定义coords_locked?address_changed?

【讨论】:

  • 我必须了解 Procs。我正在为回调而苦苦挣扎。希望能到达那里。谢谢,我再看看 Procs。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多