Как настроить маршруты для отображения дополнительной информации в URL с использованием пространств имен? - PullRequest
0 голосов
/ 13 февраля 2011

Я использую Ruby on Rails 3, и я хотел бы настроить мои маршруты для отображения дополнительной информации в URL с использованием пространств имен.

В файле rout.rb у меня есть:

namespace "users" do
  resources :account
end

Итак, URL для отображения страницы учетной записи:

http://<site_name>/users/accounts/1

Я хотел бы переписать / перенаправить этот URL как / на

http://<site_name>/user/1/Test_Username

где "Test_username" - это имя пользователя пользователя. Кроме того, я хотел бы перенаправить все URL-адреса, такие как

# "Not_real_Test_username" is a bad entered username of the user.
http://<site_name>/users/accounts/1/Not_real_Test_username

к вышеуказанному.


В этот раз я решил часть своего аналога:

  scope :module => "users" do
    match 'user/:id' => "accounts#show"
  end

Ответы [ 2 ]

0 голосов
/ 13 февраля 2011

Приношу свои извинения за то, что не ответил на ваш вопрос (@zetetic сделал это достаточно хорошо), но лучше всего придерживаться схемы URL-адресов Rails в стиле RESTful за исключением редких исключений. Таким способом большинство людей создают красивые URL-адреса, используя дефис, например ::10000

/accounts/1-username

Это не требует каких-либо изменений маршрутизации. Просто внедрите:

class Account < ActiveRecord::Base
  def to_param
    "#{self.id}-#{self.username}"
  end
end

И обработайте дополнительные строковые данные в ваших находках, вызвав to_i.

class AccountController < ApplicationController
   def show
     @account = Account.find(params[:id].to_i)
   end
end

Когда вы делаете link_to 'Your Account', account_path(@account), Rails автоматически выдаст симпатичный URL.

0 голосов
/ 13 февраля 2011

Вероятно, лучше всего это сделать в контроллере, так как вам нужно получить учетную запись, чтобы получить имя пользователя:

@account = Account.find(params[:id])
if @account && @account.username
  redirect_to("/user/#{@account.id}/#{@account.username}")
  return
end

Что касается второй проблемы, вы можете захватить оставшийся параметр, определив его в маршруте:

get "/users/accounts/:id(/:other)" => "users/accounts#show"

Эта карта выглядит так:

/users/accounts/1/something # => {:id => "1", :other => "something"}
/users/accounts/1 # => {:id => "1"}

И вы можете просто игнорировать клавишу :other в контроллере.

...