Rails - 可以单独访问的对象属性,但不能通过inspect方法访问

时间:2018-04-08 13:59:33

标签: ruby-on-rails parameters model controller

对不起,我是铁杆的新手,但无法绕过这个。

我有一个具有各种属性的Order对象 - 没有引用

在我的控制器中,我可以通过attr_accessor单独打印属性,并通过puts在控制台中查看它们。 但是当我打电话时,他们都是零!有什么建议吗?

class Order < ApplicationRecord
  attr_accessor :name, :email, :phone, :date, :dessert_type, :size, :quantity, :dessert, :comments, :total
  validates :name, :date, :quantity, presence: true
  validates :quantity, numericality: { only_integer: true, greater_than: 0}
  validate :contact_provided?


  private
    def contact_provided?
      if :email.blank? || :phone.blank?
        errors.add(:base, "Please provide either phone or email so we can contact you!")
      end
    end
end

控制器

  def create_order

    puts "create_order object"
    @order = Order.new order_params

    if @order.valid?
      puts @order.inspect

      #everything is null here
      @order.attributes.each do |attr_name, attr_value|
        puts "#{attr_name}: #{attr_value}"
      end
      #this prints out fine!
      puts "dessert: #{@order.dessert}"
    end

  end

参数

  Parameters: {"utf8"=>"✓", "authenticity_token"=>"randomtoken", "order"=>{"name"=>"jim", "email"=>"test@email.com", "phone"=>"12345678", "dessert_type"=>"Cake", "size"=>"25.0", "dessert"=>"Chocolate Caramel", "date"=>"2018-04-15", "quantity"=>"1", "comments"=>""}, "commit"=>"Submit Order"}

非常感谢任何见解!

1 个答案:

答案 0 :(得分:0)

那是因为这一行:

attr_accessor :name, :email, :phone, :date, :dessert_type, :size, :quantity, :dessert, :comments, :total

以Rails与它们一起使用的方式覆盖Order属性。在使用Rails时,您不需要该声明,因此您可以将它们删除为attr_accessor。

由于Order是ActiveRecord模型,因此ActiveRecord已经为所有对象属性生成了getter和setter。

您现在正在做的是定义所有属性,将attr_accessor作为虚拟属性,这些属性是模型中不会在数据库中保留的属性,只是&#34; 与数据库中的列不对应的属性&#34;。