1

我在更改特定模型属性(即金钱)的数据类型时遇到问题。金钱是一个整数——我正在尝试使用迁移将其更改为小数,精度为 5,小数位数为 2。迁移后,控制台中的一切看起来都正常(即迁移似乎有效) ,但是当我在网络应用程序中将值更改为小数时,我收到“无效值”消息。由于某种原因,错误似乎发生在客户端(它是一个 js 弹出窗口)?我没有包括任何客户端验证。以下是我采取的步骤:

首先,我生成迁移:

>rails generate migration change_data_type_for_user_money

然后,我编辑迁移。这是它的样子:

class ChangeDataTypeForUserMoney < ActiveRecord::Migration
  def self.up
    change_table :users do |t|
      t.change :money, :decimal, :precision => 5, :scale => 2
    end
  end

  def self.down
    change_table :users do |t|
      t.change :money, :decimal, :precision => 5, :scale => 2
    end
  end
end

然后我做一个'rake db:migrate'

奇怪的是小数点后面的零出现并且很好(例如 100.00 是可以的,但是 100.50 是我得到错误的时候)

另外,这是模型:

class User < ActiveRecord::Base
  attr_accessible :money, :name

  validates :money, :name, :presence => true
  validates :money, :numericality => true
end

而 _from 视图:

<%= form_for(@user) do |f| %>
  <% if @user.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@user.errors.count, "error") %> prohibited this user from being saved:</h2>

      <ul>
      <% @user.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </div>
  <div class="field">
    <%= f.label :money %><br />
    $<%= f.number_field :money %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

有什么想法吗?在此先感谢您的帮助!

4

1 回答 1

3

不确定,但尝试:

class ChangeDataTypeForUserMoney < ActiveRecord::Migration
  def change
    change_table :users do |t|
      t.decimal :money, :precision => 5, :scale => 2
    end
  end
end

编辑:原来问题根本不在于迁移,而在于验证器。解决方案是根据我下面的评论将 <%= f.number_field :money %> 更改为 <%= f.text_field :money %> 。

于 2012-07-13T14:04:25.703 回答