Как сохранить полученные строковые параметры в поле массива? - PullRequest
0 голосов
/ 13 ноября 2011

Как извлечь и сохранить массив из строкового параметра? Я пытаюсь преобразовать строку beafore_create, но это не работает. Когда я комментирую before_create: waypoints Ошибка монгоидного броска:

Parameters: {
    "utf8"=>"✓", 
     "authenticity_token"=>"nehoT1fnza/ZW4XB4v27uZsfFjjOu/ucIhzMmMKgWPo=", 
     "trip"=>{
         "title"=>"test", 
         "description"=>"test", 
         "waypoints"=>"[[52.40637,16.92517],[52.40601,16.925040000000003],[52.405750000000005,16.92493],[52.40514,16.92463],[52.404320000000006,16.924200000000003]]"
     }
}

Completed 500 Internal Server Error in 1ms

Mongoid::Errors::InvalidType (Field was defined as a(n) Array, but received a String with the value "[[52.40637,16.92517],[52.40601,16.925040000000003],[52.405750000000005,16.92493],[52.40514,16.92463],[52.404320000000006,16.924200000000003]]".):

РЕДАКТИРОВАТЬ Спасибо за помощь, теперь это работает, но я не знаю, хорош ли следующий подход. Я удаляю before_create и меняю имя параметра с путевых точек на waypoints_s и определяю путевые точки на def waypoints_s:

#Parameters:
#"waypoints"=>"[[52.40637,16.92517],[52.40601,16.925040000000003],[52.405750000000005,16.92493],[52.40514,16.92463],[52.404320000000006,16.924200000000003]]"
"waypoints_s"=>"[[52.40637,16.92517],[52.40601,16.925040000000003],[52.405750000000005,16.92493],[52.40514,16.92463],[52.404320000000006,16.924200000000003]]"

class Trip
  include Mongoid::Document
  field :title, :type => String
  field :description, :type => String
  field :waypoints, :type => Array

  #before_create :waypoints

  #def waypoints=(arg)
  def waypoints_s=(arg)
    if (arg.is_a? Array)
      #@waypoints = arg
      self.waypoints = arg
    elsif (arg.is_a? String) 
      #@waypoints = arg.split(',')
      self.waypoints = JSON.parse(arg)
    else 
      return false 
    end 
  end
end

class TripsController < ApplicationController
  def create
    @trip = Trip.create(params[:trip])
    @trip.save
  end
end

Ответы [ 2 ]

2 голосов
/ 13 ноября 2011

Анализ строки как объекта JSON:

require 'json'

waypoints = "[[52.40637,16.92517],[52.40601,16.925040000000003],[52.405750000000005,16.92493],[52.40514,16.92463],[52.404320000000006,16.924200000000003]]"
JSON.parse(waypoints)

=> [[52.40637, 16.92517], [52.40601, 16.925040000000003], [52.405750000000005, 16.92493], [52.40514, 16.92463], [52.404320000000006, 16.924200000000003]]
1 голос
/ 13 ноября 2011

Вам необходимо использовать serialize http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-c-serialize

Этот метод сериализует ваш объект в базу данных в формате YAML (скажем, просто текст с некоторым форматом).

class Trip < ActiveRecord::Base

  serialize :waypoints

end

trip = Trip.create( :waypoints => [[52.40637,16.92517],[52.40601,16.925040000000003],[52.405750000000005,16.92493],[52.40514,16.92463],[52.404320000000006,16.924200000000003]])

Trip.find(trip.id).waypoints # => [[52.40637,16.92517],[52.40601,16.925040000000003],[52.405750000000005,16.92493],[52.40514,16.92463],[52.404320000000006,16.924200000000003]]
...