This is continuation from This一个。在查看此问题之前,请先阅读以下问题和评论。
我有以下替换(哈希)用于在html上使用open-uri库从我想要的网站URL切换文本。
replacements = {'1杯の'=>'a cup of','たくさん'=>'a lot','たくさんの'=>'a lot of','1週間'=>'a week','午前'=>'a.m.','およそ'=>'about','住所'=>'adress','大人'=>'adult','アフリカ'=>'Africa','の後で'=>'after','のあとで'=>'after','午後'=>'afternoon','再び'=>'again','ふたたび'=>'again','空港'=>'airport','全て'=>'all','一日中'=>'all day','1日中'=>'all day','いつも'=>'always'...}
我希望将<a>
标记添加到上面哈希的所有英文单词,该单词链接到名为“Weblio”的在线日英词典服务
Weblio的网址格式如下:http://ejje.weblio.jp/{desired english word}
以便<a>
标记应添加到所有英文单词中,如下所示。
<a href="http://ejje.weblio.jp/{desired english word}">DESIRED+ENGLISH+WORD</a>
任何方式都可以轻松完成?我最近刚开始学习Ruby on Rails,所以通过一些例子对它进行详细而简单的解释会很好。
修改
def submit
require 'uri'
require 'open-uri'
require 'nokogiri'
charset = nil
@html = open(params[:url]) do |f|
charset = f.charset
f.read
end
replacements = {'1杯の'=>'a cup of','たくさん'=>'a lot'...}
regex = Regexp.new(replacements.keys.map { |x| Regexp.escape(x) }.join('|'))
@html = Nokogiri::HTML::DocumentFragment.parse(@html)
@html.traverse do |x|
if x.text?
x.content = x.content.gsub(regex, replacements)
end
end
end
EDIT2:
我遇到了一个问题,所有被替换的<a>
代码实际上都显示为<p>
代码的一部分,而不是链接。我如何逃避<a>
标记表单<p>
?
EDIT3:
这就是实际发生的事情。
https://techacademy-leoreo2247.c9users.io/result/?utf8=%E2%9C%93&url=https%3A%2F%2Fringo-12.com%2F
检查<a href="http://..../content/windows">windows</a>
上的元素以获取更多详细信息
EDIT4:
似乎它有不同的问题。 当我在我的应用上检查元素时,它应显示的代码如Windows
显示为<a href="http://ejje.weblio.jp/content/Windows">Windows</a>
。
我猜代码“Windows”被编码为其他格式。
答案 0 :(得分:2)
Weblio的网址格式如下:http://ejje.weblio.jp/ {需要 英语单词}
嗯,不完全:你的网址中没有空格,所以你必须为"a lot of"
之类的短语做些额外的事情。
在rails中,默认情况下,您使用名为ERB的内容将值替换为视图。 ERB允许您在html中编写ruby代码并执行它。您的所有视图文件都具有扩展名.html.erb
- 这是一个提示,即rails首先通过ERB模板引擎运行您的视图以生成.html文件。因此,您需要阅读有关ERB语法的教程,例如此one。以下是ERB的示例:
<%
replacements = {
'1杯の'=>'a cup of',
'たくさん'=>'a lot',
'たくさんの'=>'a lot of',
}
replacements.values.each do |phrase| %>
<a href="http://ejje.weblio.jp/<%= URI.escape(phrase) %>"><%= phrase %></a>
<% end %>
<%= .... %>
块将块中包含的ruby代码的结果插入到html中
<% ..... %>
块用于您要执行的ruby代码,但其结果不会插入到html中。
如果您在动作中创建替换,例如:
def dostuff
@replacements = {
...
}
end
然后你的观点看起来就像这样:
<% @replacements.values.each do |phrase| %>
<a href="http://ejje.weblio.jp/<%= URI.escape(phrase) %>"><%= phrase %></a>
<% end %>
下面是一个演示在轨道外使用ERB模板引擎的示例。
require 'erb'
require 'uri'
template = %q{ #=> Another way in ruby to write an opening single quote for a string.
<%
replacements = {
'1杯の'=>'a cup of',
'たくさん'=>'a lot',
'たくさんの'=>'a lot of',
}
replacements.values.each do |phrase| %>
<a href="http://ejje.weblio.jp/<%= URI.escape(phrase) %>"><%= phrase %></a>
<% end %>
} #=>Closing single quote for the string
renderer = ERB.new(template)
result = renderer.result()
puts result
--output:--
<a href="http://ejje.weblio.jp/a cup of">a cup of</a>
<a href="http://ejje.weblio.jp/a lot">a lot</a>
<a href="http://ejje.weblio.jp/a lot of">a lot of</a>
在rails中,您无需编写require
或ERB.new()
或renderer.result()
- rails会自动为.html.erb
文件执行此操作
一旦你使用ERB编写了一些视图,并且对基础知识感到满意,你可以立即忘记ERB并使用一种更好的模板语言,比如slim,它更漂亮,更容易输入再比ERB。 Rails有结合你选择的任何模板引擎的方法 - 但默认是ERB。
对评论的回应:
def dostuff
replacements = {
'1杯の'=>'a cup of',
'たくさん'=>'a lot',
'たくさんの'=>'a lot of',
}
replacements.each do |key, val|
replacements[key] = %Q{<a href="http://ejje.weblio.jp/#{URI.escape(val)}">#{val}</a>}
end
require 'pp' #pretty print
pp replacements
end
服务器窗口中的输出:
{"1杯の"=>"<a href=\"http://ejje.weblio.jp/a%20cup%20of\">a cup of</a>",
"たくさん"=>"<a href=\"http://ejje.weblio.jp/a%20lot\">a lot</a>",
"たくさんの"=>"<a href=\"http://ejje.weblio.jp/a%20lot%20of\">a lot of</a>"}
对评论的回应:
你的str是 html转义。如果您需要在网页上逐字显示字符串<a>hello</a>
中的所有字符,则必须将尖括号替换为所谓的 html实体,否则浏览器将呈现{{ 1}}标记为链接。 <a>
字符的html实体为<
,其中<
代表小于,如小于符号数学比较:lt
。同样,if x < 4
字符的html实体为>
,如大于。
>
如果您获取该程序的输出并在浏览器中打开它,您将看到:
这是一个html指令网站。首先,我们将从链接标签开始 链接标签如下所示:
require 'cgi' str = %q{<a href="http://ejje.weblio.jp/content/Windows">Windows</a>} puts "<div>This is an html instruction site. First we will start with link tags.</div>" puts "<div>Link tags look like this:</div>" puts "<div>#{CGI.escapeHTML str}</div>" str = %q{<a href="http://ejje.weblio.jp/content/Windows">Windows</a>} html = CGI.unescapeHTML str puts "<div>Here is what that link looks like when it is rendered by a browser:</div>" puts "<div>#{html}</div>" --output:-- <div>This is an html instruction site. First we will start with link tags.</div> <div>Link tags look like this:</div> <div><a href="http://ejje.weblio.jp/content/Windows">Windows</a></div> <div>Here is what that link looks like when it is rendered by a browser:</div> <div><a href="http://ejje.weblio.jp/content/Windows">Windows</a></div>
以下是该链接在浏览器呈现时的样子:
Windows