1

我是 Ruby on Rails 的初学者,很抱歉这个愚蠢的问题,但我已经搜索了一整天,但仍然坚持它:(

我有一个模型方法将文件 excel 从计算机导入到网络,第一行包含表格列,其他下一行有记录集合保存到数据库。如果它可以将所有记录保存到db,我尝试返回true,否则为false,如下所示:

模型

 def self.import(file)
   spreadsheet = open_spreadsheet(file)    //another method to read file
   header = spreadsheet.row(1)
   (2..spreadsheet.last_row).each do |i|
     row = Hash[[header, spreadsheet.row(i)].transpose]
     item= find_by_id(row["id"]) || new
     item.attributes = row.to_hash.slice(*accessible_attributes)
     if item.invalid?{
     return false;
     break
   }
    else item.save end
   end
 end

并在Controller中调用它:

 def save
   if (Item.import(params[:file]))
     redirect_to import_items_path, notice: t("success")
   else redirect_to import_items_path, notice: t("fails")
   end
 end

但是当我导入时它没有返回真/假(总是将“成功”设置为 flash.notice)

我已经将它称为这样的变量

@test = Item.import(params[:file])

并将其发送到 flash.notice 并发现该方法总是返回这样的字符串

“2..xx”(其中 xx 是文件中的行数)

我做了什么奇怪的事情吗???请帮帮我... thks 1st for any kind answer

4

1 回答 1

1

如果没有遇到无效,您的import方法不会返回。trueitems

要解决此问题,请替换:

     if item.invalid?{
     return false;
     break
   }
    else taisan.save end
   end
 end

和:

    return false if item.invalid?
    taisan.save
  end
  true
end

遇到或以其他方式将false立即返回无效。itemtrue

顺便说一句,您可以像这样保持save函数

def save
  message = if Item.import(params[:file])
              "success"
            else
              "failure"
            end

  redirect_to import_items_path, notice: t(message)
end
于 2013-04-27T09:29:57.807 回答