添加<a> tag to all items in hash - Ruby on Rails

时间:2016-06-13 05:08:31

标签: ruby-on-rails ruby

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显示为&lt;a href="http://ejje.weblio.jp/content/Windows"&gt;Windows&lt;/a&gt;

我猜代码“Windows”被编码为其他格式。

1 个答案:

答案 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中,您无需编写requireERB.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;代表小于,如小于符号数学比较:lt。同样,if x < 4字符的html实体为>,如大于

&gt;

如果您获取该程序的输出并在浏览器中打开它,您将看到:

  

这是一个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{&lt;a href="http://ejje.weblio.jp/content/Windows"&gt;Windows&lt;/a&gt;} 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>&lt;a href=&quot;http://ejje.weblio.jp/content/Windows&quot;&gt;Windows&lt;/a&gt;</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