ActiveRecord对象是否没有它的属性的实例变量,只有方法?

时间:2016-10-08 09:28:49

标签: ruby-on-rails ruby

在Rails中我有以下模型:

class Recipe < ActiveRecord::Base
    attr_accessible :name , :description , 
        :t_baking , :t_cooling , :t_cooking ,:t_rest

    # other stuff here

end

t_bakingt_coolingt_cookingt_restTime

所以在我看来,我想循环每个值。

<% ['cooking', 'baking', 'cooling' , 'rest'].each do |time| %>
    <% time_of_recipe = @recipe.instance_variable_get("@t_#{time}") %>
    <% if time_of_recipe.is_a? Time %>
        <%= time_of_recipe.strftime "%H:%M"  %>
    <% else %>
        <%= time_of_recipe %>
    <% end %>
<% end %>

它不起作用,因为

@recipe.instance_variable_get("@t_cooking").class # give NilClass

但是

@recipe.t_cooking.class # give Time

为什么?

1 个答案:

答案 0 :(得分:2)

@recipe.instance_variable_get("@t_cooking")

返回nil,因为@t_cooking没有实例变量@recipe

ActiveRecord定义的一组方法您可以访问,但这些实例变量

将其应用于您的代码,您需要将其更改为:

time_of_recipe = @recipe.public_send("t_#{time}")

此外,保存单字母输入也毫无意义。

执行以下操作会更具可读性:

<% %w(t_cooking t_baking t_cooling t_rest).each do |time| %>
    <% time_of_recipe = @recipe.public_send(time) %>
    # ...

修改

如果要检查可用的实例变量(您希望使用Rails 3.2,那么您的输出可能会略有不同):

@recipe.instance_variables
#=> [:@attributes, <============ this one is of particular interest
#     :@aggregation_cache,
#     :@association_cache,
#     :@readonly,
#     :@destroyed,
#     :@marked_for_destruction,
#     :@destroyed_by_association,
#     :@new_record,
#     :@txn,
#     :@_start_transaction_state,
#     :@transaction_state
#   ]

所以你看,它定义了一个实例变量@attributes,它包含所有属性。