使用ActiveRecord Rails虚拟属性

时间:2015-04-12 06:54:55

标签: mysql ruby-on-rails-4 activerecord virtual-attribute

我有一个MySQL数据库表,其中包含以下简化模式:

create_table "sensors", force: :cascade do |t|
  t.integer  "hex_id",     limit: 8, null: false
end

其中hex_id在MySQL中声明为BIGINT。我希望用户输入十六进制值,然后将其转换为基数10并将其保存在hex_id中。为了实现这一点,我想我会创建一个名为hex的虚拟属性来存储十六进制字符串。我的Sensor模型如下所示:

class Sensor < ActiveRecord::Base  
  attr_accessor :hex

  validates :hex, presence: true

  before_create :hex_to_bigint
  before_update :hex_to_bigint

  private
  def hex_to_bigint
    self.hex_id = hex.to_s(10)
  end
end

并且控制器正在使用标准的rails生成的代码:

  def new
    @sensor = Sensor.new
  end

  # POST /sensors
  def create
    @sensor = Sensor.new(sensor_params)

    if @sensor.save
      redirect_to @sensor, notice: 'Sensor was successfully created.'
    else
      render :new
    end
  end

我创建了一个包含使用hex属性的表单的视图。

<%= f.label :hex do %>HEX ID:
    <%= f.text_field :hex, required: true, pattern: '^[a-fA-F\d]+$' %>
<% end %>

当我点击提交时,params数组包含以下内容:

{"utf8"=>"✓", "authenticity_token"=>"some_long_token", "sensor"=>{"hex"=>"E000124EB63E0001"}, "commit"=>"Create Sensor"}

我的问题是属性hex总是空的,我的验证失败了。 Web上有许多资源可以解释如何使用虚拟属性,但很少有资源解释如何将它们与ActiveRecord结合使用。我花了几个小时寻找解决这个相当简单的问题的方法,但没有找到任何有效的方法。任何帮助表示赞赏。我的ruby版本是2.0.0p481。谢谢!

1 个答案:

答案 0 :(得分:2)

请在允许的参数中添加hex。见下面的代码

private

# Never trust parameters from the scary internet, only allow the white list through.
def sensor_params
  params.require(:sensor).permit(:hex_id, :hex)
end

我希望这会对你有所帮助