【发布时间】:2016-03-12 13:36:59
【问题描述】:
我对 Rails 还是很陌生。
我正在开发一个应用程序,您可以在其中上传 csv 文件或创建手动银行交易。以前,我在一个名为 Transaction 的表中同时拥有手动输入和上传的 csv 文件条目。现在我正在尝试将上传的文件条目存储在一个名为 Bank 的单独表中。 所以我有一个 Bank 模型和一个 Transaction 模型以及它们各自的控制器和视图。
以前我在名为“新事务”的同一页面中有“新事务”表单和“上传 CSV”表单,以避免为两者创建单独的视图,并且工作正常。 现在,在为 CSV 上传条目创建新模型(银行)后,我尝试从“新交易”页面引用银行模型的导入方法路径来导入 csv 文件。但它返回给我一个加载错误。
LoadError in BanksController#new
Unable to autoload constant BanksController, expected /app/controllers/banks_controller.rb to define it
这是我的银行模型:
class Bank < ActiveRecord::Base
belongs_to :admin
paginates_per 10
def self.to_csv(options = {})
CSV.generate(options) do |csv|
csv << column_names
all.each do |transaction|
csv << transaction.attributes.values_at(*column_names)
end
end
end
extend ActiveModel::Model
include ActiveModel::Validations
include ActiveModel::Conversion
attr_accessor :file
validates :date, presence: true
validates :notes, presence: true
validates :t_type, presence: true
validates :t_method, presence: true
validates :amount, presence: true
validates :paid_by, presence: true
validates :paid_to, presence: true
#validates :cashbox, presence: true
validates :bank, presence: true
def self.import(file)
CSV.foreach(file.path, headers: true) do |row|
transaction_hash = row.to_hash
t = Bank.new(transaction_hash.except("cashbox"))
t.id = Bank.maximum(:id).next
t.save!
end
end
end
这是我的银行主管:
class BankController < ApplicationController
before_filter :authenticate_admin!
def index
@banks = Bank.all.order('created_at DESC')
respond_to do |format|
format.html
format.csv { send_data @banks.to_csv }
end
end
def import
begin
Bank.import(params[:file])
redirect_to root_url, notice: "Transactions Imported!"
rescue ActiveRecord::RecordInvalid => exception
redirect_to :back, alert: "#{exception.message}"
end
end
def editview
@q = Transaction.ransack(params[:q])
respond_to do |format|
format.html
format.csv { send_data @transactions_list_for_csv.to_csv, filename: 'transactions.csv' }
end
end
end
这是我来自交易模型的新交易视图,其中包含新交易和上传 csv 的表单:
<div class="col-md-6">
<div class="container new-container">
<h3>New Transaction</h3>
<%= render 'form' %> </br>
<%= link_to "Back", root_path %>
</div>
</div>
<div class="divider"></div>
<div class="col-md-6">
<div class="import-col">
<h3>Import a CSV File:</h3>
<%#= form_tag import_transactions_path, multipart: true do %>
<%= form_tag import_banks_path, multipart: true do %>
<%= file_field_tag :file, class: "form-control", required: true %></br>
<%= submit_tag "Import CSV", class: "btn btn-success" %>
<% end %>
</div>
</div>
这是事务控制器的新方法:
def new
@transaction = Transaction.new
end
【问题讨论】:
标签: ruby-on-rails csv