ruby-on-rails - 仅为 View 更改 Rails 模型中的属性

标签 ruby-on-rails ruby ruby-on-rails-4

我有个小问题。我发现为此创建标题真的很难,我希望我能更好地解释它:

我们的一位客户要求,在“item_number”的每个实例中,当它来自 Product 模型时,应用程序必须显示它有 5 个前导零。

该模型中的“item_number”属性实际上是数据库中的一个整数。

我们的第一种方法只是更改模型中的值:

def item_number
  item_number.to_s.rjust(5, '0')
end

当然我们得到:

SystemStackError at /
stack level too deep

而且我很确定在创建/更新记录时这会搞砸,但这没关系,无论如何它都不起作用。

解决方案很简单,只需创建:

def item_number_with_leading_zeroes
  item_number.to_s.rjust(5, '0')
end

并在我们的 View 中用它替换 item_number。

但是,我们有超过 5000 次使用它,其中一些不是来自这个模型(我们只需要替换这个模型上的 item_number),还有一些在我们编码的迭代器中没有使用父对象名称(所以我可能不知道它是否来自这个模型),其他来自自定义表单输入,我们不能只是“全部替换”。

我将不得不手动检查“item_number”的每个实例,看看是否需要将其更改为新方法。而且我仍然会犯错误并影响很多东西。

我只需要在 View 上更改它,我想过一种让它与助手一起工作的方法,但这仍然意味着我必须逐个更改它。

还有另一种方法可以修复它,将数据库中的所有记录更新为带零的字符串,并从现在开始创建一个 before_save 选项,但在采用这种方法之前,我们首先想要一个 Rails 解决方案(保留数据库原样)现在)。

我没有想法,我不知道是否有解决方案,我想先在这里问一下,希望有人能分享一些想法。 有什么方法可以做到这一点而无需手动检查整个应用程序?

Ruby 2、Rails 4.0

谢谢!

最佳答案

尝试使用 read_attribute 来避免递归:

class Product < ActiveRecord::Base
  ...
  def item_number
    read_attribute(:item_number).to_s.rjust(5, '0')
  end
  ...
end

关于ruby-on-rails - 仅为 View 更改 Rails 模型中的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25308434/

相关文章:

ruby-on-rails - 如何在 Rails 中发送带有样式的 HTML 电子邮件

ruby-on-rails - 在 Ubuntu 14.04 上安装 ruby​​ 的正确方法是什么

ruby - 如何在 Rack/测试中设置 env ['SERVER_NAME' ]?

ruby-on-rails - 带有 rails-api 和 Angular JS 的 SPA

mysql - 将 args 传递给 rails dbconsole

ruby-on-rails - Rails 4 混淆了我的一个引擎模型与另一个引擎库模块

ruby-on-rails - 在 rails 中按日/月/年查询订单

mysql - 将用户 .csv 文件中的数据导入表中

ruby - Ruby 中 |= 的复杂性

ruby-on-rails - Rails 4选择性 Assets 摘要