在Rails中我有以下模型:
class Recipe < ActiveRecord::Base
attr_accessible :name , :description ,
:t_baking , :t_cooling , :t_cooking ,:t_rest
# other stuff here
end
t_baking
,t_cooling
,t_cooking
,t_rest
为Time
。
所以在我看来,我想循环每个值。
<% ['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
为什么?
答案 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
,它包含所有属性。