0

我有一个带有位置属性的模型,它是一个由两个元素组成的数组;纬度和经度。我像这样定义位置的访问器

class Address
    include Mongoid::Document
    include Mongoid::Timestamps
    include Mongoid::Spacial::Document

    field :location,        :type => Array,    spacial: {lat: :latitude, lng: :longitude, return_array: true }


    #accessors for location


    def latitude
        location[0]
    end

    def latitude=( lat )
        location[0] = latitude
    end

    def longitude
        location[1]
    end

    def longitude=( lng )
        location[1] = lng
    end
    attr_accessible :location, :latitude, :longitude

end

这是控制器代码

def create
        @address = Address.new(params[:address])
        if @address.save
            redirect_to :action => 'index'
        else
            render :action => 'new'
        end
    end

    def update
        @address = Address.find(params[:id])

        if @address.update_attributes(params[:address])
            redirect_to :action => 'index'
        else
            render :action => 'edit'
        end

    end

在视图级别

<%= f.hidden_field :latitude%>
<%= f.hidden_field :longitude%>

这些隐藏字段是通过js操作的,没关系。我看到它查看开发人员工具

这是控制器接收的参数

"address"=>{"latitude"=>"-38.0112418", "longitude"=>"-57.53713060000001", "city_id"=>"504caba825ef893715000001", "street"=>"alte. brown", "number"=>"1234", "phone"=>"223 4568965"}, "commit"=>"Guardar", "id"=>"504cacc825ef893715000006"}

请注意,纬度和经度参数已更改,没关系,但此更改未保存到 mongodb

因此,纬度和经度的值不会被保存。我的代码是否缺少任何说明?

提前致谢。

- - 编辑 - -

这是工作访问器

    def latitude
        location[0]
    end

    def latitude=( lat )
        self.location = [lat,self.location[1]]
    end

    def longitude
        location[1]
    end

    def longitude=( lng )
        self.location = [self.location[0], lng]
    end
4

1 回答 1

0

当你想设置数据库的一个字段时,使用self总是更安全,这是一个好习惯。

第二件事,您必须使用传递给 setter 的参数。

结果代码:

def latitude
  location[0]
end

def latitude=( lat )
  self.location[0] = lat
end

def longitude
  location[1]
end

def longitude=( lng )
  self.location[1] = lng
end
于 2012-09-09T17:54:47.977 回答