Rails中的Self.find方法Active Model无法正常工作

时间:2012-03-05 04:59:40

标签: ruby-on-rails ruby activemodel

我目前正在使用API​​,而不是数据库,我希望与ActiveRecord一样接近,所以我决定继续这样做,就像这里的railscast一样:http://railscasts.com/episodes/219-active-model

到目前为止,我的save方法运行良好,因此我可以将数据保存到API。我的问题是编辑,我的find方法似乎是问题......这是一些代码!

我的控制器中的编辑方法

  def edit
    @parking = Parking.find(params[:id])
  end

整个模型

class Parking
  include ActiveModel::Validations
  include ActiveModel::Conversion
  extend  ActiveModel::Naming

  attr_accessor :name, :address, :city, :longitude, :latitude, :contributor_name, :contributor_email

  validates_presence_of :name, :address, :city, :longitude, :latitude

  def initialize(attributes = {})
    attributes.each do |name, value|
      send("#{name}=", value)
    end
  end

  def self.find(id)
    parking           = Parse.get("Parking", id.to_s) // API Call

    name              = parking["name"]
    address           = parking["address"]
    city              = parking["city"]
    longitude         = parking["location"]["longitude"]
    latitude          = parking["location"]["latitude"]
    contributor_name  = parking["contributorName"]
    contributor_email = parking["contributorEmail"]

    return self
  end

  def save
    if (!valid?)
      return false
    else
      parking = Parse::Object.new("Parking")

      data =
      {
        :longitude => 40.0,
        :latitude  => -30.0
      }

      point = Parse::GeoPoint.new(data)

      parking["location"]         = point
      parking["name"]             = name
      parking["address"]          = address
      parking["city"]             = city
      parking["contributorName"]  = contributor_name
      parking["contributorEmail"] = contributor_email

      if (parking.save)
        return true
      end
    end
  end

  def persisted?
    false
  end
end

以下是我目前收到的错误:

undefined method `to_key' for Parking:Class

提取的来源(第1行):

1: <%= form_for(@parking, :html => { :class => "form-horizontal"}) do |f| %>
2:   <% if @parking.errors.any? %>
3:     <div class="alert alert-error fade in">
4:       <a class="close" data-dismiss="alert">×</a>**

如果有人提出建议,我真的对任何想法持开放态度,我开始使用rails:)

谢谢!

修改

当我在我的控制器编辑方法中执行以下操作时:

  def edit
    @parking = Parking.new
    @parking.name              = "foo"
    @parking.address           = "foo"
    @parking.city              = "foo"
    @parking.longitude         = "foo"
    @parking.latitude          = "foo"   
  end

我的视图在每个字段中加载foo没有问题,所以问题是我必须对find方法做错了吗。)

1 个答案:

答案 0 :(得分:4)

一个问题是你的find方法是类方法(由于是'self.find'),这意味着它不能在类的实例上运行,因此不了解实例变量/方法,例如nameaddress等。

实现find的更好方法是实例化Parking的新实例,并填充它的变量,然后将其返回,例如。

def self.find(id)
   raw = Parse.get("Parking", id.to_s)

   parking = Parking.new
   parking.name = raw["name"]
   #  etc for the others

   parking # Return the newly-created instance
end

这并不能解释您目前看到的“未定义方法”,您可能需要发布更多详细信息才能获得答案,尤其是异常的完全回溯,以查看实际提出的代码位它。根据您提供的信息,我猜测Parse.get方法中的某些内容会导致它。