簡體   English   中英

在Ruby on Rails的URL中用'-'替換'%20'

[英]Replace '%20' with '-' in url for Ruby on Rails

我在生成的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%>頁面將顯示特定的書籍屬性。

當<%= book.bookname%>傳遞到url中時,上面的行中存在問題。 一些書在數據庫中有空格和大寫字母。 最好用破折號代替空格,並在url中將所有大寫字母改為小寫字母。 但是,這樣做將導致參數在控制器文件中不匹配。 最好的方法是什么?

也許您想看看Friendly ID- https://github.com/norman/friendly_id

如果您應用gem,則將在books表中創建一個名為“ slug”的新屬性。

該段將自動生成連字符(-)。 因此,在您的情況下,如果您有一本書的標題為“拯救了瑞典國王的女孩”,那么在創作時會產生以下create:“瑞典國王的女孩”。 我想目前您的網址中也存在大寫字母的問題-這樣做無害,但並不干凈。 這樣那個問題也會消失:)

PS:如果標題重復,它也有助於創建獨特的子彈。 例如,如果您的網站上有相同標題的書,但出版商不同或出版日期不同,則可以定義子條目候選者-這意味着,如果另一個條目具有相同的子條目,則您想添加另一個屬性。

這是一個例子:

#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/

由於您不知道哪個字母可能是大寫字母,因此假設您可以在實名和URL安全名稱之間來回轉換是不安全的。 我將給出解決方案的概述; 請原諒我沒有時間為您編寫代碼。

  • Book模型中,在create方法上創建一個after_filter
    • 獲取書名並將其轉換為您選擇的URL安全名稱。
    • 保存前檢查名稱是否重復,並增加名稱或創建另一個唯一的變體
  • 在鏈接中使用網址安全名稱
  • 使用網址安全名稱查找圖書
  • 僅顯示普通名稱

該解決方案使您避免使用ID值,因為ID值不會創建令人難忘的URL。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM