ОК, Есть много вещей, чтобы работать дальше. Начнем с того, как вы разбираете HTML. Если все, что вы делаете разборе фрагмент или один тег, вы можете использовать DocumentFragment сказать Nokogiri, чтобы не добавлять обычные HTML-теги:
require 'nokogiri'
doc = Nokogiri::HTML('<img class="img-responsive" src="img/logologo.png" alt="">')
doc.to_html # => "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body><img class=\"img-responsive\" src=\"img/logologo.png\" alt=\"\"></body></html>\n"
Вместо этого, вы можете сделать:
doc = Nokogiri::HTML::DocumentFragment.parse('<img class="img-responsive" src="img/logologo.png" alt="">')
doc.to_html # => "<img class=\"img-responsive\" src=\"img/logologo.png\" alt=\"\">"
Следующая , не используйте css
, xpath
или search
, если вы имеете в виду at
, at_css
или at_xpath
. Размышлять об этом:
doc.css('img').class # => Nokogiri::XML::NodeSet
doc.at('img').class # => Nokogiri::XML::Element
doc.css('img')[0].to_html # => "<img class=\"img-responsive\" src=\"img/logologo.png\" alt=\"\">"
doc.css('img').first.to_html # => "<img class=\"img-responsive\" src=\"img/logologo.png\" alt=\"\">"
doc.at('img').to_html # => "<img class=\"img-responsive\" src=\"img/logologo.png\" alt=\"\">"
That css
, xpath
и search
возвращает NodeSet значит и что вспомнить. at
и его варианты эквивалентны использованию first
или [0]
на возвращаемом NodeSet, возвращая первый узел, поэтому используйте at
и друзей, если это то, что вы имеете в виду, так как это приводит к тому, что код не такой шумный.
Вот как я бы об этом:
require 'nokogiri'
doc = Nokogiri::HTML::DocumentFragment.parse('<img class="img-responsive" src="img/logologo.png" alt="">')
img = doc.at('img')
img_src = img.delete('src')
img_params = img.map { |p, v| ":%s => '%s'" % [p, v] }.join(', ')
# => ":class => 'img-responsive', :alt => ''"
img_template = "<%%= image_tag('%s', %s) %%>" % [img_src, img_params]
# => "<%= image_tag('img/logologo.png', :class => 'img-responsive', :alt => '') %>"
Конечно, используя формат :k => "v"
для ключа/значения старой школы. Я бы рекомендовал изменения в:
img_params = img.map { |p, v| "%s: '%s'" % [p, v] }.join(', ') # => "class: 'img-responsive', alt: ''"
что приводит:
"<%= image_tag('img/logologo.png', class: 'img-responsive', alt: '') %>"
Почему вы хотите перевести статический 'img' HTML тег в' image_tag' с атрибутами жёстко? Чего вы пытаетесь достичь? – spickermann
Когда я разрабатывал страницу erb, мне нужно преобразовать '' из-за конвейера ресурсов rails. Мой сторонний партнер знает, как писать 'html' вместо' erb'. –