【问题标题】:Referring another model's method from current model's view从当前模型的角度引用另一个模型的方法
【发布时间】: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


    【解决方案1】:

    控制器应该以复数形式命名。重命名为BanksController

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-20
      • 2012-03-30
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多