Ruby Rails多个虚拟属性单个数据库字段

时间:2013-04-15 01:36:57

标签: ruby-on-rails validation attributes virtual

编写一个ROR应用程序,其中单个数据库字段(经度)将显示为多个屏幕字段(long_degrees,long_minutes,long_seconds,long_direction)。我目前正在尝试在不使用scuccees的情况下为模型添加编辑。

我使用gem geo_position来存储经度和纬度。

我得到的具体错误是我无法访问模型中的屏幕字段。在下面显示的代码中,我将尝试访问模型中的字段,以显示(注释为导致错误)。我没有成功地尝试过各种各样的IF语句。

MVC

1-模型 - 演习

    class Drill < ActiveRecord::Base
    include ActiveModel::ForbiddenAttributesProtection
    ...
    validate :validate_longitude

    def validate_longitude
       # if self.long.degrees > 180
       # if long.degrees > 180
       # if 
       #   line above causes error
       #   errors.add(self.lat.degrees, "Degrees must be between 0 and 180")
       # end
    end

使用第一行“如果测试测试我得到以下错误         对于#

,未定义的方法“long”

2-视图 - _form

    ....
    <%= "Longitude - degrees " %>
    <% if @drill.longitude%>
      <%= f.fields_for :long do |m| %>
        <%= m.input_field :degrees, as: :integer, value: longitude(@drill).degrees %>
        <%= "minutes "%>
        <%= m.input_field :minutes, as: :integer, value: longitude(@drill).minutes %>
        <%= "seconds "%>
        <%= m.input_field :seconds, as: :decimal, value: longitude(@drill).seconds %>
        <%= "direction "%>
        <%= m.input_field :direction, collection: %w{W E}, as: :select, selected: longitude(@drill).direction, include_blank: false %>
      <% end %>
    <% else %>
      <%= f.fields_for :long do |m| %>
      <%= m.input_field :degrees, as: :integer, value: '' %>
      <%= "minutes "%>
      <%= m.input_field :minutes, as: :integer, value: '' %>
      <%= "seconds "%>
      <%= m.input_field :seconds, as: :decimal, value: '' %>
      <%= "direction "%>
      <%= m.input_field :direction, collection: %w{W E}, as: :select, include_blank: false %>
    <% end %> 

在控制器中         class DrillsController&lt; ApplicationController的         before_filter:load_drill,除了:[:index,:new,:create]

   def index
     @drills = Drill.all
     respond_to do |format|
       format.html # index.html.erb
       format.json { render json: @drills }
    end
  end

  ...
  private

    def drill_params
    params.require(:drill).permit(:name, :country_id,:state_id, :basin_id, 
          :directional_offset_metres, :ground_level_elevation_metres,
          :rotary_table_elevation_metres, :lat, :long, :sub_basin_structure_ids=>[]  )
    end
    ...
非常感谢 皮埃尔

数据库虚拟属性名称长(一个也用于lat),数据库列称为经度。 数据库列存储为经度=“19 deg 19'19.19”W“ 并显示为 经度 - 度19分19秒19.19方向W

0 个答案:

没有答案