0

这是我的代码。

class Product < ActiveRecord::Base
 attr_accessible :name, :price, :released_on
begin
  validates :name, uniqueness: true
  rescue ActiveRecord::RecordInvalid => e
  render( inline: "RESCUED ActiveRecord::RecordInvalid" )
  return
end
def self.to_csv(options = {})
CSV.generate(options) do |csv|
  csv << column_names
  all.each do |product|
    csv << product.attributes.values_at(*column_names)
  end
end
end



def self.import(file)
CSV.foreach(file.path , headers:true) do |row|
Product.create! row.to_hash   # If we want to add a new item

end
end
end

当我保存具有相同名称的重复模型时,会引发异常

ProductsController#import 中的 ActiveRecord::RecordInvalid

Validation failed: Name has already been taken

Rails.root: /home/deepender/396-importing-csv-and-excel/store-before

我正在使用救援操作仍然没有处理错误?任何猜测我错了。

4

2 回答 2

5

夫妇的事情。你不把你validatesbegin/rescue块包裹起来。所以你的模型应该看起来像:

class Product < ActiveRecord::Base
  attr_accessible :name, :price, :released_on
  validates :name, uniqueness: true
end

它在您执行验证并适当处理它的控制器中。示例控制器可能如下所示:

class ProductsController < ApplicationController
  def create
    @product = Product.new(params[:product])
    if @product.valid?
      @product.save
      flash[:notice] = "Product created!"
      redirect_to(@product) and return
    else
      render(:action => :new)
    end
  end
end

然后在您看来,您可能会将实际错误呈现给用户:

# app/views/products/new.html.erb

<%= error_messages_for(@product) %>
.. rest of HTML here ..

error_messages_for默认情况下不再包含在 Rails 中,它在 gem 中dynamic_form

有关显示错误的通用方法,请参阅此 Rails 指南:

http://guides.rubyonrails.org/active_record_validations.html#displaying-validation-errors-in-views

于 2013-08-01T18:17:23.687 回答
3

正如 Cody 提到的,不要在 begin/rescue 中包装你的 valites,因为 validates 方法只是告诉你的模型需要验证什么,而不是实际验证方法运行的地方。

然后,您的导入方法应如下所示:

def import(file)
  CSV.foreach(file.path , headers:true) do |row|
  product = Product.new(row.to_hash)

  if product.save
    # product valid and created 
  else
    # invalid record here... you can inspect product.errors
  end

end
于 2013-08-01T18:36:25.180 回答