FasterCSV является определенно способом пойти, но если Вы захотите служить ему непосредственно из Вашего приложения для направляющих, Вы захотите настроить некоторые заголовки ответа, также.
я имею в наличии метод для установки имени файла и необходимых заголовков:
def render_csv(filename = nil)
filename ||= params[:action]
filename += '.csv'
if request.env['HTTP_USER_AGENT'] =~ /msie/i
headers['Pragma'] = 'public'
headers["Content-type"] = "text/plain"
headers['Cache-Control'] = 'no-cache, must-revalidate, post-check=0, pre-check=0'
headers['Content-Disposition'] = "attachment; filename=\"#{filename}\""
headers['Expires'] = "0"
else
headers["Content-Type"] ||= 'text/csv'
headers["Content-Disposition"] = "attachment; filename=\"#{filename}\""
end
render :layout => false
end
Используя это облегчает иметь что-то вроде этого в моем контроллере:
respond_to do |wants|
wants.csv do
render_csv("users-#{Time.now.strftime("%Y%m%d")}")
end
end
И имеют представление, которое похоже на это: (generate_csv
от FasterCSV)
UserID,Email,Password,ActivationURL,Messages
<%= generate_csv do |csv|
@users.each do |user|
csv << [ user[:id], user[:email], user[:password], user[:url], user[:message] ]
end
end %>
Потому что он помещает в код вещи, которых никто никогда не просил. Как если бы у вас был этот код:
$foo = bar;
$baz = qxx;
и это изменение:
$foo = bar;
$foo++;
$baz = qxx;
было объединено с этим изменением:
$foo = bar;
$foo--;
$baz = qxx;
таким образом, который каким-то образом произвел:
$foo = bar;
$foo++;
$foo--;
--$baz;
$baz = qxx;
Очевидно, это зло.
Я предполагаю, что это man gitglossary
вызывает достаточно беспокойства, потому что чем больше задействованы ваши алгоритмы слияния, тем больше вероятность того, что они произведут такое.
Я думаю, что это можно было бы назвать «злым слиянием», потому что это сложный угловой случай, когда «git blame» решает при аннотировании файла (генерации построчных аннотаций истории).
Evil merge может потребоваться, когда вы разработали функцию «A» в основной ветви и функцию «B» в боковой ветви, и эти функции конфликтуют семантическим (нетекстовым) образом. В качестве примера можно использовать одно и то же имя для глобальной переменной с разными значениями - это требует переименования переменной для одной из функций.
Для злого слияния " git show --cc
" имеет непустое значение компактный комбинированный diff (но я не уверен, является ли это отношением эквивалентности; импликация может быть только в одном направлении, то есть «злое слияние», а затем непустое « git diff-tree -p --cc
» ).