如果模型属性为nil,Ruby on rails将返回一个字符串

时间:2018-01-15 10:17:04

标签: ruby-on-rails ruby rails-activerecord rails-models

我有一个具有一个配置文件的用户模型。该配置文件具有名称,性别,年龄,dob,名称等属性。配置文件中没有字段是必需的。 用户仅由管理员通过电子邮件地址和密码创建。创建用户时,所有配置文件字段均为零。创建用户后,他可以注册并编辑他的个人资料。当我们转到用户个人资料时,我想显示用户详细信息,如果未设置详细信息,我想显示“未设置”。

转向方法是覆盖配置文件模型中的属性,如:

def name
  super || 'not set'
end
def age
  super || 'not set'
end
//and so on 

但这样做会产生大量的代码重复。 在视图中执行<%= @user.name || 'not set'%>也会导致大量代码重复。

我想过将'not set'作为迁移中所有属性的默认值,但有些字段是整数和日期,所以它不可行,而且我们无法添加翻译。

我查看了ActiveRecord属性,并尝试将默认值设置为我的字符串

class Profile < ApplicationRecord
attribute :name, :string, default: "not set"

但这与在rails迁移中分配默认值相同,但对其他数据类型不起作用。

我希望有一种类似

的方法
def set_default(attribute)
  attribute || 'not set'
end

这种情况必须非常普遍,但我很惊讶没有发现任何与此相关的问题,这里是stackoverflow或其他地方。我google了很多但找不到解决方案。任何链接也非常感谢。

2 个答案:

答案 0 :(得分:2)

也许有些元编程?

class YourModel
  %w(name age).each do |a| # Add needed fields
    define_method(a) do
      super() || 'not set'
    end
  end
end

这可以提取到一个问题,并将其包含在您需要的地方。

答案 1 :(得分:1)

我建议不要在模型中设置默认值。使用Presenter / Decorator显示UI用途的默认值。

这是Draper(https://github.com/drapergem/draper)的示例,但是还有其他装饰器库,您甚至可以编写基本的装饰器而不添加依赖项:

class ProfileDecorator < Draper::Decorator
  DEFAULT = "not set".freeze
  def name
    model.name || DEFAULT
  end
end

# and then use it like:

profile.decorate.name 

至于复制:我更喜欢在元编程上复制大部分时间。更容易调试,阅读,查找和理解,恕我直言。