替换'%20'用' - '在Ruby on Rails的url中

时间:2014-05-05 02:16:55

标签: ruby-on-rails ruby regex url

我在更换'%20'时遇到了一些问题。用' - '在生成的URL中。基本上,我有一个书籍搜索表单,将用户输入与数据库和显示页面相匹配,然后填充匹配的书籍。然后,用户可以点击查看更多'显示页面上的按钮,用于指向特定项目的页面(通过数据库填充属性)。

在显示页面上,当用户点击“查看更多内容”时,我有以下行将项目名称传递给网址:

<td><br><a href="/books/<%=book.bookname%>">View More</a>

路线文件将包含以下行:

match '/books/:display_book', to: 'books#show', via:'get'

然后将参数:display_book传递到控制器文件中:

@displaybook=Book.find_by(bookname: params[:display_book])

然后页面/books/<%=book.bookname%>,将显示特定的图书属性。

当&lt;%= book.bookname%&gt;,传递到网址时,上述行中存在此问题。有些书在数据库中有空格和大写字母。最好用破折号替换空格,并在网址中将所有大写字母设为小写字母。但是,这样做会导致参数在控制器文件中不匹配。最好的方法是什么?

2 个答案:

答案 0 :(得分:1)

也许您想查看友情ID - https://github.com/norman/friendly_id

如果您应用gem,您将在book表中创建一个名为&#34; slug&#34;的新属性。

使用连字符( - )自动生成slug。所以在你的情况下,如果你有一本名为&#34;拯救瑞典国王的女孩&#34;它将在创作时创造出以下的slu ::&#34; the-girl-the-saved-the-of-sweden&#34;。我想你目前在你的网址中也有大写字母的问题 - 这不会造成伤害,但不是很干净。所以这个问题也会消失:)

PS:如果您有重复的标题,它还有助于创建独特的slu ..例如,如果您的网站上的图书具有相同的标题但发布者不同或发布日期不同,则可以定义slug候选 - 这意味着如果存在具有相同slug的其他条目,则您希望添加另一个属性。

以下是一个例子:

#models/book.rb 
extend FriendlyId
friendly_id :slug_candidates, use: :slugged

private
def slug_candidates
  [  :title
     [:title, :publisher],
     [:title, :publisher, :publish_date]
  ]
end

这里有关于rails 4的详细说明:http://norman.github.io/friendly_id/4.0/

答案 1 :(得分:0)

由于您不知道哪些字母可能是大写字母,因此假设您可以在实名和URL安全名称之间来回转换是不安全的。我将概述解决方案;请原谅,我没有时间为你编写代码。

  • Book模型中,在after_filter方法上创建create
    • 获取图书名称并将其转换为您选择的网址安全名称。
    • 保存前检查重复的名称,并增加名称或创建另一个唯一的变体
  • 在链接中使用网址安全名称
  • 使用网址安全名称查找图书
  • 仅显示正常名称

此解决方案可让您避免ID值,这不会创建令人难忘的有吸引力的URL。