从Controller到View渲染ActiveRecord响应

时间:2013-05-19 19:29:10

标签: ruby-on-rails ruby ruby-on-rails-3.2 rails-activerecord

我是Rails的新手。我正在使用Rails 3.2.13。我会尽量保持我的问题简洁:

在我的控制器中,我想从Observation表中获取最后10个条目。我有:

def index
   @times = Observation.select(:load_time).last(10)
end

在该视图中,我尝试在@times中渲染10个条目,如下所示:

<% @times.each do |time| %>
<p>time: <%= time %></p>
<% end %>

我在网页上收到的回复如下:

time: #<Observation:0x007fe22bf2a138>

我想知道如何将实际时间变量作为浮点数而不是(看起来像是什么)内存地址。似乎最后10个条目正确地进入控制器,这是好的。

我的观察中没有逻辑&lt; ActiveRecord :: Base类,因为迁移负责定义模式。这是我的db / migrate / create_observations.rb的样子:

class CreateObservations < ActiveRecord::Migration
  def change
    create_table :observations do |t|
        t.float :load_time
        t.timestamps        
    end

提前感谢您提供任何帮助 - 非常感谢。

2 个答案:

答案 0 :(得分:2)

您只需访问对象内的变量

<%= time.your_field %>

在你的情况下:

<%= time.load_time %>

答案 1 :(得分:1)

在您看来,<%= time =>会转换为_buf << time.to_s(其中_buf是ERb的内部输出缓冲区)。一个简单的解决方法是定义Observation#to_s,如下所示:

class Observation < ActiveRecord::Base
  def to_s
    load_time.to_s
  end
end

请注意,Observation.select(:id).map(&:to_s)现在会导致ActiveModel::MissingAttributeError错误(因为to_s要求此列存在)。

一般情况下,我会明确地获取您需要的结果,例如在您的情况下:

<% @times.each do |time| %>
  <p>time: <%= time.load_time %></p>
<% end %>