Ruby on rails 替换';%20';与'-';RubyonRails的url中

Ruby on rails 替换';%20';与'-';RubyonRails的url中,ruby-on-rails,ruby,regex,url,Ruby On Rails,Ruby,Regex,Url,我在生成的url中将“%20”替换为“-”时遇到一些问题。基本上,我有一个图书搜索表单,它将用户输入的内容与数据库相匹配,然后用匹配的图书填充一个显示页面。然后,用户可以单击显示页面上的“查看更多”按钮,并将其指向该特定项目的页面(通过数据库填充属性) 在显示页面上,当用户单击“查看更多”时,我有以下几行将项目名称传递到url: <td><br><a href="/books/<%=book.bookname%>">View More</a&

我在生成的url中将“%20”替换为“-”时遇到一些问题。基本上,我有一个图书搜索表单,它将用户输入的内容与数据库相匹配,然后用匹配的图书填充一个显示页面。然后,用户可以单击显示页面上的“查看更多”按钮,并将其指向该特定项目的页面(通过数据库填充属性)

在显示页面上,当用户单击“查看更多”时,我有以下几行将项目名称传递到url:

<td><br><a href="/books/<%=book.bookname%>">View More</a>
参数:display_book随后将被传递到控制器文件:

@displaybook=Book.find_by(bookname: params[:display_book])
然后,/books/页面将显示特定的books属性


当传递到url时,问题存在于上行中。有些书在数据库中有空格和大写字母。最好用破折号替换空格,并将url中的所有大写字母转换为小写字母。但是,这样做将导致控制器文件中的参数不匹配。最好的办法是什么

也许你想看看友好ID-

如果应用gem,您将在books表中创建一个名为“slug”的新属性

slug将自动生成连字符(-)。因此,在你的例子中,如果你有一本书名为《拯救瑞典国王的女孩》的书,它将创造出以下关于创造的故事:“拯救瑞典国王的女孩”。我想目前你的url中也有大写字母的问题——这没有坏处,但不干净。所以这个问题也会消失:)

PS:如果你有重复的标题,它也有助于创建独特的slug。例如,如果站点上有相同标题但不同出版商或不同出版日期的书籍,则可以定义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的详细说明:

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

  • Book
    模型中,在
    create
    方法上创建
    after\u过滤器
    
    • 获取图书名称并将其转换为您选择的URL安全名称
    • 保存前检查重复名称,并增加名称或创建另一个唯一变量
  • 在链接中使用url安全名称
  • 使用url安全名称查找书籍
  • 仅显示普通名称

此解决方案可以避免ID值,因为ID值不会创建令人难忘的或有吸引力的URL。

此外,它还可以让您的生活非常轻松地在控制器中搜索特定条目。例如show action:@book=book.friendly.find(参数[:id])。。。除了在模型后放置“友好”外,无需更改任何内容
#models/book.rb 
extend FriendlyId
friendly_id :slug_candidates, use: :slugged

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