Я начал читать Rails Antipatterns сегодня и хотел применить некоторые из этих методов в действии.Я рефакторинг экспорта CSV, который я изначально встроил в контроллер.Так как это плохая практика, я учел это в модели ... потом в своей собственной модели.Таким образом, я могу использовать метод для других целей.
У меня есть модель со следующим методом:
#app/models/imagery_request.rb
class ImageryRequest < ActiveRecord::Base
def convert
ImageryRequestConverter.new(self)
end
end
У меня есть другая модель, подобная этой:
#app/models/imagery_request_converter.rb
class ImageryRequestConverter
attr_reader :imagery_requests
def initialize(imagery_requests)
@imagery_requests = imagery_requests
end
def to_csv
csv_string = FasterCSV.generate do |csv|
# header row
csv << ["id", "service_name", "description", "first_name", "last_name", "email", "phone_contact", "region",
"imagery_type", "file_type", "pixel_type", "total_images",
"tile_size", "progress", "expected_date", "high_priority", "priority_justification",
"raw_data_location", "service_overviews", "is_def",
"isc_def", "special_instructions", "navigational_path", "FY Queue",
"created_at", "updated_at"]
# data rows
@imagery_requests.each do |ir|
csv << [ir.id, ir.service_name, ir.description, ir.first_name, ir.last_name, ir.email,
ir.phone_contact, ir.region, ir.imagery_type, ir.file_type, ir.pixel_type,
ir.total_images, ir.tile_size, ir.progress, ir.expected_date, ir.high_priority,
ir.priority_justification, ir.raw_data_location, ir.service_overviews,
ir.is_def, ir.isc_def, ir.special_instructions, ir.navigational_path,
ir.fyqueue, ir.created_at, ir.updated_at
]
end
# send it to the browser with proper headers
send_data csv_string,
:type => 'text/csv; charset=iso-8859-1; header=present',
:disposition => "attachment; filename=Imagery_Requests-#{Time.now.strftime("%Y%m%d")}.csv"
end
end
end
Когда я пытаюсь сослаться на это с моей точки зрения:
<%= link_to @imagery_requests.convert.to_csv %>
Я получаю сообщение об ошибке:
undefined method `convert' for #<ActiveRecord::Relation:0x21f966d0>
Как мне вызвать этот метод?