[英]Ruby on rails return a string if a model attribute is nil
我有一個配置文件的用戶模型。 該配置文件具有名稱,性別,年齡,出生日期,名稱等屬性。 配置文件中的任何字段都不是必填字段。 該用戶僅由管理員通過電子郵件地址和密碼創建。 創建用戶時,所有配置文件字段均為零。 創建用戶后,他可以注冊並編輯其個人資料。 當我們轉到用戶個人資料時,我想顯示用戶詳細信息,如果未設置詳細信息,我想顯示“未設置”。
可行的方法是覆蓋配置文件模型中的屬性,例如:
def name
super || 'not set'
end
def age
super || 'not set'
end
//and so on
但是這樣做會造成很多代碼重復。 做<%= @user.name || 'not set'%>
視圖中的<%= @user.name || 'not set'%>
還會導致大量代碼重復。
我曾考慮過將“未設置”作為遷移中所有屬性的默認值,但是某些字段是整數和日期,因此它不可行,而且我們無法添加翻譯。
我調查了ActiveRecord屬性,並嘗試將默認值設置為我的字符串
class Profile < ApplicationRecord
attribute :name, :string, default: "not set"
但這就像在rails遷移中分配默認值一樣,不適用於其他數據類型。
我希望有一種方法可以做到
def set_default(attribute)
attribute || 'not set'
end
這樣的場景一定很普遍,但是我在這里沒有發現與此有關的任何問題感到非常驚訝,在stackoverflow或其他地方。 我在Google上搜索了很多,但找不到解決方案。 任何鏈接也將不勝感激。
也許一些元編程?
class YourModel
%w(name age).each do |a| # Add needed fields
define_method(a) do
super() || 'not set'
end
end
end
可以將其提取為關注點,並在需要時將其包括在內。
我建議不要在模型中設置默認值。 使用演示者/裝飾者來顯示用於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
至於復制:大多數時候,我寧願復制而不是元編程。 恕我直言,更易於調試,閱讀,查找和理解。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.