rails routes 討論


#1

我看到這個網站

發現他companies後面接的不是用 id 當作網址,而是每個公司都有一串string當作網址
這是怎麼弄的?是在建立一個 對應的 table嗎?
這樣有什麼好處或是壞處嘛?

感覺這樣會變得更慢,不如直接跟JC大講的用數字攪拌器攪一攪就好了?


#2

params[:id] 這個鬼啊,隨便你用的啦 … Rails route 全都支援

所以人家有考量時就會改用別的方式,再來,int 其實是一個很浪費流量的單位,明明一個 char 就可以包一票鬼東西,然而很多時候速度其次,安全性或是其他考量都比速度優先的

你可以去看 int 與 Base58 互轉該怎樣玩,然後把你的東西也改來玩看看

當然那間公司不是用這個,只是顯示 params[:id] 其實有無數可能,而有些公司會用 uuid / md5 / sha1 … 來當 key 就是不要讓人玩簡易跳號之類的

再來可能也不是 table => RDBMS,這年頭 NoSQL 那麼好玩,很多也都比 RDBMS 快,現在都猜不到人家底層怎樣實作了,而丟出去的 String 說不定是 AES / DES / 攪亂器過的,所以也不一定是 mapping table 就是

so~ 以上那麼多,不要見怪不怪了


#3

哈哈瞭解原來是這樣子
我少見多聞多要看看世面


#4

routes
get '/product/:title', to: 'products#show'
把resources拉出來後(prefix)product_path會消失
view
<%= link_to 'XXX', controller: "products", action: "show", title: product.title %>
products_controller
@product = Product.find_by(title: params[:title])

額外補充
Pretty URLs

Routes can generate pretty URLs. For example:

get '/articles/:year/:month/:day' => 'articles#find_by_id', constraints: {
  year:       /\d{4}/,
  month:      /\d{1,2}/,
  day:        /\d{1,2}/
}

Using the route above, the URL “localhost:3000/articles/2005/11/06” maps to

params = {year: '2005', month: '11', day: '06'}


#5

終於算是搞定了
routes新增

get 'post/:id', :to => 'posts#find_by_date
resources :posts <--原本的這可以不用加,但要記得新增要在原action上面

Post Model

  def to_param
    Base64.urlsafe_encode64((self.id).to_s + "lzIGxpbmUgdHdvClRoaXMgaXMgb")
  end

Posts Controller

  require 'base64'
  def find_by_date
    @post = Post.find((Base64.urlsafe_decode64(params[:id])).gsub("lzIGxpbmUgdHdvClRoaXMgaXMgb",""))
  end

新增find_by_date.html.erb即可