2016-12-10 4 views
0

Ich habe diese Railscast auf CSV/Excel Export verfolgt, aber ich habe ein bisschen ein Problem mit der Assoziationslogik.Schienen 5 - Export nach XL/CSV, aber durch Assoziationen

CSV Verwirrung/Ausgabe

In meinem Collection Model Ich habe

class Collection < ApplicationRecord 
    belongs_to :user 
    has_many :card_collections 
    has_many :cards, through: :card_collections 

    def self.to_csv 
    attributes = %w{name} 

    CSV.generate(headers: true) do |csv| 
     csv << attributes 

     all.each do |collection| 
     csv << attributes.map{ |attr| collection.send(attr) } 
     end 
    end 
    end 

    # validates :user_id, presence: true 
end 

CSV Export

name 
Demo 2 
HEHHEHEEHHE 

Name ist der Spaltenname Demo 2 ist die erste Sammlung HEHHEHEE HHE ist die zweite Sammlung

Ich brauche viel mehr Informationen, aber sobald ich 'einen' Parameter bekomme, kann ich von dort gehen. Aber das funktioniert nicht.'name 'gibt den Namen aller Sammlungen zurück, was nicht ganz das ist, was ich will, aber ich versuche auch Informationen über die' Karten 'in der Sammlung zu bekommen (referenziert von cards_collection) Um Ihnen ein Beispiel zu geben - In der Konsole würde ich eingeben: c = Collection.last c.cards.first.name und ich würde den ersten Kartennamen bekommen. Ich bin nicht sicher, ob ich diese self.to_csv Funktion in der Card_collections Steuerung, der Cards Steuerung oder was machen sollte. Ich habe viel von ähnlichen Fragen in Bezug auf CSV durch Assoziationen, aber nichts gefunden, das mich zu einer Lösung

Excel Verwirrung

<?xml version="1.0"?> 
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" 
    xmlns:o="urn:schemas-microsoft-com:office:office" 
    xmlns:x="urn:schemas-microsoft-com:office:excel" 
    xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" 
    xmlns:html="http://www.w3.org/TR/REC-html40"> 
    <Worksheet ss:Name="Card Collection"> 
    <Table> 
     <Row> 
     <Cell><Data ss:Type="String">Name</Data></Cell> 
     <Cell><Data ss:Type="String">Text</Data></Cell> 
     <Cell><Data ss:Type="String">Set</Data></Cell> 
     </Row> 
    <% @collection.card_collections.each do |collection| %> 
     <Row> 
     <Cell><Data ss:Type="String"><%= collection.card.name %></Data></Cell> 
     <Cell><Data ss:Type="String"><%= collection.card.text %></Data></Cell> 
     <Cell><Data ss:Type="String"><%= collection.card.set %></Data></Cell> 
     </Row> 
    <% end %> 
    </Table> 
    </Worksheet> 
</Workbook> 

ist ein Beispielskript geführt hat - ich dies in einem eingewickelt tatsächlich haben " jedes, weil, wenn sie Excel wählen, ich ihnen erlauben werde, ein Blatt pro "Sammlung" zu erhalten.

Sie eine Vorstellung von der Beziehung zu geben, meine Collection View sieht aus wie -

<p id="notice"><%= notice %></p> 
<div class="center"><%= @collection.name %></div><br /> 
<div class="center">Made By: 
<strong> 
    <% if @collection.public %> 
    <%= link_to @collection.user.name, {:controller => "users", :action => "show", :id => @collection.user.id} %><br /> 
    <% else %> 
    Anonymous<br /> 
    <% end %> 
</strong> 
Total Cards: <%= @collection.card_collections.sum(:card_counts) %> 
Distinct Cards: <%= @collection.card_collections.count %> <br /> 
</div> 
    <% @collection.card_collections.in_groups_of(3, false).each do |group| %> 
    <div class='row'> 
    <% group.each do |card| %> 
     <div class='col-sm-6 col-md-4'> 
     <%= image_tag(card.card.image_url, class: "img-responsive") %> 
     <h3> 
      <%= link_to card.card.name, {:controller => "cards", :action => "show", :id => card.card.id }%> 
     </h3> 
     <div><%= card_text_swap(card.card.text) %></div> 
     <div><span class='cardLabel'>Set</span>: <i class="ss ss-<%= card.card.set.downcase %> ss-3x ss-<%= card.card.rarity.downcase %>"></i> 
       <span class="setName"><%= card.card.setName %></span> 
     </div> 
     <div>Total in Collection: <%= card.card_counts %></div> 
     </div> 
    <% end %> 
    </div> 
    <% end %> 


<%= link_to 'Edit', edit_collection_path(@collection) %> | 
<%= link_to 'Back', collections_path %> 

ich ursprünglich bei der Herstellung der Ansicht gekämpft, aber schließlich habe es funktioniert, und ich versuche, die gleiche Logik zu verwenden, im Excel-Export, aber es wird nicht richtig dargestellt. (Immediate Null-Fehler, so denke ich, das ein Fehler meinerseits sein könnte.)

Zusätzliche Informationen All dies innerhalb ActiveDirectory- gespeichert ist, und zur Zeit auf eine Ansicht gerendert wird. Ich bin mir nicht sicher, welche anderen Informationen ich anbieten sollte.

Neue Excel-Ausgabe

Collections_Controller

def show 
    @collection = Collection.find(params[:id]) 
    respond_to do |format| 
     format.html 
     format.csv { render text: @collection.to_csv } 
     format.xls { send_data @collection.to_csv(col_sep: "\t") } 
    end 
    end 

Ansicht

<%= link_to "CSV", collection_path(format: "csv") %> | 
    <%= link_to "Excel", collection_path(format: "xls") %> 

CSV arbeitet jetzt - Excel ist es nicht.

Fehler bereitgestellt:

ArgumentError in CollectionsController#show 
wrong number of arguments (given 1, expected 0) 
+0

Was möchten Sie in der CSV-Datei erhalten? –

+0

@ZaurAmikishiyev Eine grundlegende Menge an Informationen wäre CardName, und CardSet 'c.card_collections.first.card.name' und' c.card_collections.first.card.set' ist, wie ich diese in der Rails-Konsole erhalten würde. Die'Ansammlungsansicht' zeigt, wie ich sie zur Ansicht – DNorthrup

+0

aufrufe. Sie müssen eine Sammlungs_ID an Sammelpfad übergeben und nur das Format –

Antwort

1

"def self.to_csv" definiert eine Klasse-Methode. Wenn Sie Karten für eine gegebene Sammlung auflisten möchten, müssen Sie eine Instanzmethode definieren und aufrufen (in der show-Methode Ihres Collections-Controllers).

Also änderte ich Ihre to_csv auf folgende Weise:

def to_csv 
    attributes = %w{name} 

    CSV.generate(headers: true) do |csv| 
    csv << attributes 
    cards.each do |card| 
     csv << attributes.map{ |attr| card.send(attr) } 
    end 
    end 
end 

Dies ist, wie in Ihrem Controller nennen to_csv:

class CollectionsController < ApplicationController 
    def show 
    @collection = Collection.find(params[:id]) 
    respond_to do |format| 
     format.html 
     format.csv { render text: @collection.to_csv } 
    end 
    end 
end 

für Excel:

<?xml version="1.0"?> 
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" 
    xmlns:o="urn:schemas-microsoft-com:office:office" 
    xmlns:x="urn:schemas-microsoft-com:office:excel" 
    xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" 
    xmlns:html="http://www.w3.org/TR/REC-html40"> 
    <Worksheet ss:Name="Card Collection"> 
    <Table> 
     <Row> 
     <Cell><Data ss:Type="String">Name</Data></Cell> 
     <Cell><Data ss:Type="String">Text</Data></Cell> 
     <Cell><Data ss:Type="String">Set</Data></Cell> 
     </Row> 
    <% @collection.cards.each do |card| %> 
     <Row> 
     <Cell><Data ss:Type="String"><%= card.name %></Data></Cell> 
     <Cell><Data ss:Type="String"><%= card.text %></Data></Cell> 
     <Cell><Data ss:Type="String"><%= card.set %></Data></Cell> 
     </Row> 
    <% end %> 
    </Table> 
    </Worksheet> 
</Workbook> 

Und im Allgemeinen Wenn Sie Karten für gegebene @ collection zugreifen möchten, verwenden Sie einfach cards Beziehung und Sie wird nicht extra .card benötigen, wenn Sie auf die Attribute der angegebenen Karte zugreifen.

+0

Missachtung - ich denke, es war nur Cache. Es funktioniert jetzt perfekt. Vielen dank für Deine Hilfe! – DNorthrup