2

次の簡略化されたスキーマを持つ 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 です。ありがとう!

4

1 に答える 1

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

これがお役に立てば幸いです

于 2015-04-15T12:09:22.610 に答える