Rails + Postgresql:第一次没有保存数据

时间:2014-10-15 21:57:14

标签: ruby-on-rails postgresql

我第一次尝试提交表单时收到错误

  

“价格不是有效数字”

第二次尝试提交它时没关系(在价格字段中使用相同的有效数据)。 如果我不在模型中添加验证,则提交表单,但不保存价格值。

可能发生什么事? .decimal字段有什么特别之处吗?

db schema:

t.decimal  "price"

模型

validates :price, numericality: { :greater_than => 0, :less_than_or_equal_to => 100000000 }

表单视图文件

<%= f.number_field :price, class: "short red" %>

控制器

  def new
    @product = Product.new
  end


  def create
    @product = Product.new(product_params)
      if @product.save
        redirect_to @product
      else
        render :new
      end
  end

private

def product_params
  params.require(:product).permit(:name, :description, :image, :price, :user_id)
end

日志

  

于2014-10-15 22:56:51 +0000开始为xxx.132发布“/ products”   ProductsController处理#创建为HTML
  参数:{“utf8”=&gt;“✓”,   “authenticity_token”=&gt; “中abte / LtO0T / ZtSXQIuXVVjjUvwHw5jDUJ1yIKCOWRx2 =”,   “product”=&gt; {“name”=&gt;“”,“description”=&gt;“”,“user_id”   =&gt;“1”},“commit”=&gt;“提交”}

2 个答案:

答案 0 :(得分:1)

您可以检查的一些事项:

  1. 表单中的代码段从f.number_field开始。检查您是否在表单顶部使用<%= form_for(@product) do |f| %>之类的内容。

  2. 尝试使用rails控制台创建产品。

  3. 在rails控制台中,尝试以下方法:

    > p = Product.new
    > p.valid?
    #=> TRUE or FALSE should appear
    > p.errors.full_messages.to_sentence
    # you should see a full list of all failed validations from your Product model
    
  4. 如果这些没有帮助,请尝试将整个product_controller.rb和_form.html.erb文件粘贴到您的问题中,我将再次查看。

答案 1 :(得分:0)

尝试将迁移更改为:

t.decimal :price, precision: 8, scale: 2  #for example

然后,将验证更改为:

validates :price, numericality: {greater_than_or_equal_to: 0.01, :less_than_or_equal_to => 100000000 }

在PostgreSQL中,下一个实现行为:十进制列:

  

PostgreSQL :: precision [1..infinity],:scale [0..infinity]。没有   默认值。

我希望,这个例子来自&#34;敏捷Web开发与Rails 4&#34;帮助您理解十进制数的验证:

  

可以在此字段中输入0.001等数字。因为   数据库只存储小数点后的两位数,这个   最终会在数据库中为零,即使它会通过   验证,如果我们比较零。检查号码是否为   至少1美分确保只存储正确的值。