访问器和update_attributes

时间:2012-09-09 15:52:48

标签: ruby-on-rails ruby-on-rails-3 mongoid

我有一个带有location属性的模型,它是一个包含两个元素的数组;纬度和经度。我为这个位置定义了访问器

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

1 个答案:

答案 0 :(得分: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