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

複製モデルを同じ名前で保存すると、例外が発生します

ActiveRecord::RecordInvalid in ProductsController#import

Validation failed: Name has already been taken

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

レスキュー操作を使用していますが、ハンドリング エラーではありませんか? 私が間違っていると推測します。

4

2 に答える 2

3

Cody が述べたように、valites を begin/rescue でラップしないでください。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 に答える