次の簡略化されたスキーマを持つ MySQL データベース テーブルがあります。
create_table "sensors", force: :cascade do |t|
t.integer "hex_id", limit: 8, null: false
end
whereはMySQLhex_idで a として宣言されています。BIGINTユーザーが 16 進数値を入力してから、それを基数 10 に変換してhex_id. hexこれを実現するために、16 進数の文字列を格納するという仮想属性を作成しようと考えました。私の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
コントローラーは標準のレール生成コードを使用しています。
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。このかなり単純な問題を解決する方法を探すのに何時間も費やしましたが、うまくいくものは何も見つかりませんでした. どんな助けでも大歓迎です。私のルビーのバージョンは 2.0.0p481 です。ありがとう!