簡體   English   中英

如果模型屬性為nil,Ruby on Rails將返回一個字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM