我有一个具有一个配置文件的用户模型。该配置文件具有名称,性别,年龄,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了很多但找不到解决方案。任何链接也非常感谢。
答案 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
至于复制:我更喜欢在元编程上复制大部分时间。更容易调试,阅读,查找和理解,恕我直言。