如何在rails上的ruby中为实例变量附加一些值?

时间:2013-04-20 06:46:53

标签: ruby-on-rails ruby ruby-on-rails-3 controller instance-variables

以下是我在家庭控制器中尝试做的事情:

def view
    @product= Product.find(params[:id])
    rand_price = rand(202- @product.price.to_i) + @product.price.to_i
    old_price = rand_price + @product.price.to_i

    @product << old_price  #error line
end

我想在我的变量中再添加一个old_price值,而不在Product模型中添加相同的列。错误是:

undefined method `<<' for #<Product:0x7f1362cc5b88>

3 个答案:

答案 0 :(得分:1)

你可以说

class << @product
  attr_accessor :old_price
end
@product.old_price = old_price

将属性注入实例变量。

<<你所指的方式会为数组添加一个值,这不是你想要做的。

另一种方法是添加:

attr_accessor :old_price

到您的Product模型。这会将old_price添加到Product的所有实例中,而不会将其作为表格中的字段。

答案 1 :(得分:1)


使用序列化程序 在模型中:

class Product << ActiveRecord::Base
  serialize :prices, Array

  ...
end

数据库中的column products.prices应该是字符串。

在控制器中

def update
  @product= Product.find(params[:id])
  rand_price = rand(202- @product.price.to_i) + @product.price.to_i
  new_price = rand_price + @product.price.to_i

  @product.prices << new_price
  @product.save!
end

你可以使用它:

  @product.prices # => array of all prices.
  @product.prices.last # => current price

答案 2 :(得分:0)

错误,因为@product是Product对象而不是Array。

&LT;&LT;与Array对象一起使用

并且Ruby没有通过这种方式添加属性的权限(比如Javascript)。

您应该声明'old_price'

的attr_accessor