Rails - 使用Model实例绑定一个函数

时间:2015-12-15 06:51:06

标签: ruby-on-rails

我有完全设计的数据库,它工作得很好,显示数据库中的数据和所有内容。 相机DB" is_online"

中有一个选项

我将其作为<%= camera.is_online %>。 我想要做的是将一个函数绑定到它,它将为它着色,基于是和否,如果它是的它将是绿色,如果它是否它将是红色。 问题。在Camera / _camera视图中定义此类方法的位置 所以我可以做<%= camera.is_online.color %>之类的事情 PS:我见过一个装饰词,与装订相同.color

2 个答案:

答案 0 :(得分:0)

Rails视图助手看起来是你的答案。

app / helpers / application_helper.rb 中的

def colourize text
    colour = (text == "yes" ? "green" : "dark gray")
    content_tag span, text, style: "color: #{colour}"
end

然后在您的视图中使用

<%= colourize camera.is_online %>

答案 1 :(得分:0)

最简单的方法是创建一个实例方法:

#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

说实话,这可能比这更值得麻烦。