mysql - Rails 虚拟属性与 ActiveRecord

标签 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

Controller 使用标准 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 属性的表单创建了一个 View 。

<%= 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"=>"创建传感器"}

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

最佳答案

请在允许的参数中添加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

希望这对你有帮助

关于mysql - Rails 虚拟属性与 ActiveRecord,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29586854/

相关文章:

mysql - 让 --lines-terminated-by 在 mysqldump 中工作

mysql - mysql 过程出错

ruby-on-rails - Rails 配置和类变量

php - Yii2删除ActiveRecord错误消息有时是数组,有时不是吗?

ruby-on-rails - 如果验证失败,Rails 会跳过其他验证

javascript - 如何使用 php 将动态文本框值插入到同一 ID 上的数据库表中?

php - 添加行时 MySQL 中的自动日期列

ruby-on-rails - 收集抛出的RoutingError消息

mysql - 如何在使用 Rails 事件记录查询中的联接时获取第二个表的结果

ruby-on-rails - "Append"两个不同的ActiveRecord::Relation 变成一个ActiveRecord::Relation