Метод Self.find Active Model в Rails не работает - PullRequest
3 голосов
/ 05 марта 2012

В настоящее время я использую API, а не базу данных, и я хочу быть настолько близким, как ActiveRecord, поэтому я решил пойти дальше и сделать в точности как этот Railscast здесь: http://railscasts.com/episodes/219-active-model

Пока что мой метод сохранения работает хорошо, поэтому я могу сохранять данные в API. Моя проблема с редактированием, мой метод поиска, похоже, проблема ... Вот код!

Редактировать метод в моем контроллере

  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>**

Если кто-нибудь в качестве предложений, я действительно открыт для любых идей, я начинаю с рельсов:)

Спасибо!

EDIT:

Когда я делаю в моем контроллере метод редактирования что-то вроде:

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

Мой просмотр загружает foo во все поля без проблем, поэтому проблема в том, что я должен что-то делать не так с методом find:)

1 Ответ

4 голосов
/ 05 марта 2012

Одна проблема заключается в том, что ваш find метод является методом класса (в силу того, что он «self.find»), то есть он не работает с экземпляром класса и поэтому не имеет знанийпеременных / методов экземпляра, таких как name, address и т. д.

Лучший способ реализовать 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 вызывает это.

...