【问题标题】:Rails + Postgresql: data not saved first timeRails + Postgresql:第一次没有保存数据
【发布时间】:2014-10-15 21:57:13
【问题描述】:

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

“价格不是有效数字”

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

会发生什么? .decimal 字段有什么特别之处吗?

数据库架构:

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 处理#create as HTML
参数:{"utf8"=>"✓", "authenticity_token"=>"abte/LtO0T/ZtSXQIuXVVjjUvwHw5jDUJ1yIKCOWRx2=", "产品"=>{"名称"=>"", "描述"=>"", "user_id" =>“1”},“提交”=>“提交”}

【问题讨论】:

  • 发送到控制器的具体内容是什么?
  • 我已经更新了帖子。嗯,查看日志,似乎有类似的问题:图像(字符串),第一次没有保存(图像模型中没有验证 - 就像价格一样)。您认为问题可能是什么?
  • 表单是什么样的?没有任何东西被发送,所以当然没有任何东西被保存。

标签: ruby-on-rails postgresql


【解决方案1】:

你可以检查一些事情:

  1. 表单中的 sn-p 以 f.number_field 开头。检查您是否在表单顶部使用了类似&lt;%= form_for(@product) do |f| %&gt; 的内容。

  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
    

如果这些没有帮助,请尝试将整个 product_controller.rb 和 _form.html.erb 文件粘贴到您的问题中,我会再看一遍。

【讨论】:

    【解决方案2】:

    尝试将您的迁移更改为:

    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 中的下一个实现行为与 :decimal 列:

    PostgreSQL: :precision [1..infinity], :scale [0..infinity]。不 默认。

    我希望,“Agile Web Development with Rails 4”中的这个例子可以帮助你理解十进制数字的验证:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 2012-09-22
      • 1970-01-01
      相关资源
      最近更新 更多