0

我最近在我的 RoR 项目中添加了一个导入选项,该选项似乎正在上传文件,并将此文件成功存储到数据库中,但当它尝试创建新用户并保存它们时,我收到以下错误

Started GET "/imports/13/proc" for 127.0.0.1 at 2012-07-11 02:52:00 +1000
Processing by ImportsController#proc_csv as HTML
  Parameters: {"id"=>"13"}
  User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
  Import Load (0.1ms)  SELECT "imports".* FROM "imports" WHERE "imports"."id" = ? LIMIT 1  [["id", "13"]]
   (0.1ms)  begin transaction
  User Exists (0.2ms)  SELECT 1 FROM "users" WHERE "users"."email" = 'paul.mcguane1@westnet.com.au' LIMIT 1
   (0.1ms)  rollback transaction
   (0.1ms)  begin transaction
  User Exists (0.2ms)  SELECT 1 FROM "users" WHERE "users"."email" = 'compact721@***.com' LIMIT 1
   (0.1ms)  rollback transaction
   (0.1ms)  begin transaction
  User Exists (0.2ms)  SELECT 1 FROM "users" WHERE "users"."email" = 'paul.****@me.com' LIMIT 1
   (0.1ms)  rollback transaction
   (0.1ms)  begin transaction
  User Exists (0.2ms)  SELECT 1 FROM "users" WHERE "users"."email" = 'duncansingleton@****.com' LIMIT 1
   (0.1ms)  rollback transaction
   (0.1ms)  begin transaction
   (0.4ms)  UPDATE "imports" SET "processed" = 4, "updated_at" = '2012-07-10 16:52:01.146297' WHERE "imports"."id" = 13
[paperclip] Saving attachments.
   (3.5ms)  commit transaction

这是我在导入控制器中的代码

def new_user(line)
    params = Hash.new
    params[:user] = Hash.new
    params[:user]["email"] = line[0]
    params[:user]["gender"] = "male"
    params[:user]["password"] = "abc231"
    params[:user]["first_name"] = line[1]
    params[:user]["last_name"] = line[3]
    user = User.new(params[:user])
    user.save
  end


def proc_csv
    @import = Import.find(params[:id])
    lines = parse_csv_file(@import.csv.path)
    lines.shift #comment this line out if your CSV file doesn't contain a header row
    if lines.size > 0
      @import.processed = lines.size
      lines.each do |line|
        case @import.datatype
          when "releases"
            new_user(line)
            flash[:notice] = "Saving data processing was successful."
        end
      end
      @import.save
      flash[:notice] = "CSV data processing was successful."
      redirect_to :action => "show", :id => @import.id
    else
      flash[:error] = "CSV data processing failed."
      render :action => "show", :id => @import.id
    end
  end

  private

  def parse_csv_file(path_to_csv)
    lines = []

    #if not installed run, sudo gem install fastercsv
    #http://fastercsv.rubyforge.org/
    require 'csv'

    CSV.foreach(path_to_csv) do |row|
      lines << row
    end
    lines
  end

用户模型

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable,
  # :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :omniauthable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me, :admin, :manager
  attr_accessible :provider, :uid
  # attr_accessible :title, :body

  belongs_to :team
  has_many :availabilities
  attr_accessible :last_name, :first_name, :jersey, :dob, :gender, :position, :team_id, :mobile, :state, :city, :postcode



  GENDER_TYPES = [:Male, :Female]
  STATE_TYPES = [:ACT, :VIC, :QLD, :NSW, :TAS, :NT, :WA, :SA]

  validates :first_name, :last_name, :gender, :presence => true
  validates :email, :presence => true, :uniqueness => true
  validates_format_of :email, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i, :message => "isn't a valid email address"
  validates_format_of :mobile, :with => /^(?:\+?61|0)4(?:[01]\d{3}|(?:2[1-9]|3[0-57-9]|4[7-9]|5[0-35-9]|6[679]|7[078]|8[178]|9[7-9])\d{2}|(?:20[2-9]|444|68[3-9]|79[01]|820|901)\d|(?:200[01]|2010|8984))\d{4}$/, :message => "isn't a valid mobile number", :allow_blank => true
  validates_format_of :postcode, :with => /^[0-9]{4}/, :message => "isn't a valid Australian postcode", :allow_blank => true

导轨控制台消息

1.9.3p194 :001 > params = {
1.9.3p194 :002 >                :user => {
1.9.3p194 :003 >                          :gender => "male",
1.9.3p194 :004 >                       :last_name => "paul",
1.9.3p194 :005 >                        :password => "abc231",
1.9.3p194 :006 >                      :first_name => "mcguane",
1.9.3p194 :007 >                           :email => "paul.mcguane1@westnet.com.au"
1.9.3p194 :008?>                }
1.9.3p194 :009?>            }
 => {:user=>{:gender=>"male", :last_name=>"paul", :password=>"abc231", :first_name=>"mcguane", :email=>"paul.mcguane1@westnet.com.au"}} 
1.9.3p194 :010 > user = User.new(params[:user])
 => #<User id: nil, postcode: nil, city: nil, state: nil, manager: nil, admin: nil, mobile: nil, team_id: nil, position: nil, gender: "male", dob: nil, email: "paul.mcguane1@westnet.com.au", jersey: nil, last_name: "paul", first_name: "mcguane", created_at: nil, updated_at: nil, encrypted_password: "$2a$10$i81k9gX3uYJ95oID.deGyOtDGFSnK6ooI0BIUiP6UtgZ...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: nil, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, provider: nil, uid: nil> 
1.9.3p194 :011 > user.valid?
  User Exists (0.2ms)  SELECT 1 FROM "users" WHERE "users"."email" = 'paul.mcguane1@westnet.com.au' LIMIT 1
  User Exists (0.1ms)  SELECT 1 FROM "users" WHERE "users"."email" = 'paul.mcguane1@westnet.com.au' LIMIT 1
 => true 
1.9.3p194 :012 > user.errors.full_messages
 => [] 
1.9.3p194 :013 >

带有 ! 的导轨控制台 方法

    1.9.3p194 :013 > user.save!
   (0.1ms)  SAVEPOINT active_record_1
  User Exists (0.3ms)  SELECT 1 FROM "users" WHERE "users"."email" = 'paul.mcguane1@westnet.com.au' LIMIT 1
  User Exists (0.2ms)  SELECT 1 FROM "users" WHERE "users"."email" = 'paul.mcguane1@westnet.com.au' LIMIT 1
  SQL (135.5ms)  INSERT INTO "users" ("admin", "city", "created_at", "current_sign_in_at", "current_sign_in_ip", "dob", "email", "encrypted_password", "first_name", "gender", "jersey", "last_name", "last_sign_in_at", "last_sign_in_ip", "manager", "mobile", "position", "postcode", "provider", "remember_created_at", "reset_password_sent_at", "reset_password_token", "sign_in_count", "state", "team_id", "uid", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)  [["admin", nil], ["city", nil], ["created_at", Wed, 11 Jul 2012 20:05:28 EST +10:00], ["current_sign_in_at", nil], ["current_sign_in_ip", nil], ["dob", nil], ["email", "paul.mcguane1@westnet.com.au"], ["encrypted_password", "$2a$10$i81k9gX3uYJ95oID.deGyOtDGFSnK6ooI0BIUiP6UtgZOuzWzQbFy"], ["first_name", "mcguane"], ["gender", "male"], ["jersey", nil], ["last_name", "paul"], ["last_sign_in_at", nil], ["last_sign_in_ip", nil], ["manager", nil], ["mobile", nil], ["position", nil], ["postcode", nil], ["provider", nil], ["remember_created_at", nil], ["reset_password_sent_at", nil], ["reset_password_token", nil], ["sign_in_count", nil], ["state", nil], ["team_id", nil], ["uid", nil], ["updated_at", Wed, 11 Jul 2012 20:05:28 EST +10:00]]
   (0.1ms)  RELEASE SAVEPOINT active_record_1
 => true 
4

1 回答 1

1

从您的代码片段和日志输出看来,由于某些验证问题,您的用户没有被保存。通常,当我遇到这样的问题时,我会直接进入 rails 控制台,看看我的代码尝试做的事情是否也可以在控制台中工作。如果它在控制台上运行,那么您的代码应该可以运行。

尝试这个

$ rails c --sandbox

> params = {
           :user => {
                   :gender => "male",
                :last_name => "paul",
                 :password => "abc231",
               :first_name => "mcguane",
                    :email => "paul.mcguane1@westnet.com.au"
           }
         }

> user = User.new(params[:user])
> user.valid?
> user.errors.full_messages

这样,您就可以隔离用户验证是否真的是问题的原因。它可能完全是另一回事。如果您发布您的用户模型代码也会有所帮助。

我还注意到您在lines迭代器中设置了 Flash 通知。每次迭代一行时,您只是简单地覆盖它。

于 2012-07-11T08:45:50.313 回答