最簡單的方法是創建一個實例方法:
#app/models/camera.rb
class Camera < ActiveRecord::Base
def color
is_online? ? "green" : "red"
end
end
這允許您撥打:
@camera.color
你可以使用一個translator,因爲發現我已經不得不與custom method(否則它會非常凌亂)連接使用:
#Gemfile
gem "human_attribute_values"
#View
<%= camera.human_attribute_values(:is_online) %>
#config/locales/en.yml
en:
activerecord:
values:
camera:
is_online:
'true': "green"
'false': "red"
這是更久一點比我想象的更快,但它是實現你所需要的一種方式。
另一種選擇,因爲你所提到的,就是用decorators,基本上允許您創建依賴於該值的當前屬性自定義屬性:
#Gemfile
gem 'draper', '~> 1.3'
#app/decorators/camera_decorator.rb
class CameraDecorator < Draper::Decorator
def color
object.is_online? ? "green" : "red"
end
end
#app/controllers/cameras_controller.rb
class CamerasController < ApplicationController
def show
@camera = Camera.find(params[:id]).decorate
end
end
誠實,這可能比這樣做更麻煩。