在视图模板中显示数据库中不存在的虚拟属性

时间:2018-09-19 16:44:16

标签: ruby-on-rails ruby ruby-on-rails-4

我试图在视图模板上显示的信息不在数据库中,而是出于逻辑推论,但这对我不起作用。

这是我所做的:

模型

class SignupHistory < ActiveRecord::Base

  attr_accessor(:device)

  def device_used # This method returns the device used from User-Agent and mapped as either Desktop or Mobile
    device = "#{request.headers["User-Agent"].match(/\(.*?\)/)[0].split('(')[1].split(';')[0]}"
    [:Macintosh, :Windows, :Linux, :Unix].include?(device) ? 'Desktop' : 'Mobile'
  end
end

模板视图

.row
  .panel.panel-primary
    .panel-heading
      span = t('admin_header.traffics')
    .panel-body
      = table_for(@traffic, class: 'table table-condensed table-hover') do |t|
        - t.column :device, 'Devise Used', class: 'col-xs-2' # I want to output the returned value in device_used method here.

我不想在数据库中创建新属性,我只想在视图中为数据库中的所有条目显示该对象。

从下图可以看到,它应该显示device_used方法的结果,但不显示任何内容 template view picture

1 个答案:

答案 0 :(得分:0)

class SignupHistory < ActiveRecord::Base

  attr_accessor(:device)

  def device_used # This method returns the device used from User-Agent and mapped as either Desktop or Mobile
    device = "#{request.headers["User-Agent"].match(/\(.*?\)/)[0].split('(')[1].split(';')[0]}"
    [:Macintosh, :Windows, :Linux, :Unix].include?(device) ? 'Desktop' : 'Mobile'
  end

您的device方法中的device_used是一个局部变量,无法按您想要的方式进行访问,在这种情况下attr_accessor与编写此变量相同,这就是您的列为空白的原因

def device
end

要完成所需的操作,您想使用别名,您应该将其添加到您的班级中,这样会很好。

alias_method :device, :device_used