Rails 3 переименовывает маршруты - PullRequest
1 голос
/ 10 марта 2011

Я только начинаю с Rails 3, и я не совсем понимаю, как перейти к переименованию маршрутов.

Что я хочу:

Для переименования пути к паре users#show контроллер / действие. Таким образом, вместо URL-адреса www.example.com/users/show/1 это будет просто www.example.com/1/home

В будущем я также хотел бы иметь возможность добавлять дополнительные пути в конец, такие как:

www.example.com/1/home/profile/

Как настроены мои пользовательские ресурсы:

resources :users, :except => [:destroy] do
  resources :favorites, :only => [:show, :update]
  resources :profiles, :only => [:show, :update]
end

Что я пробовал:

match :home, :to => 'users#show' 

Что случилось:

ActiveRecord::RecordNotFound in UsersController#show

  Couldn't find User without an ID

Что находится в файле development.log:

Started GET "/home" for 127.0.0.1 at 2011-03-10 13:36:15 -0500
  Processing by UsersController#show as HTML
  [1m[35mUser Load (1.6ms)[0m  SELECT "users".* FROM "users" WHERE ("users"."id" = 101) LIMIT 1
Completed   in 192ms

ActiveRecord::RecordNotFound (Couldn't find User without an ID):
  app/controllers/users_controller.rb:19:in `show'

Что находится в пользовательском контроллере:

def show
  @user = User.find(params[:id])

  respond_to do |format|
    format.html # show.html.haml
  end
end

Итак, очевидно, он хранит идентификатор пользователя, как показано в журнале разработки как 101, но по какой-то причине я все еще получаю эту ошибку?

Любая помощь, которую вы можете оказать, очень ценится!

Ответы [ 2 ]

2 голосов
/ 10 марта 2011

Вы должны предоставить ключ сегмента в вашем матче:

match ':id/home' => 'users#show'

Но с этим переименованием вы получите не RESTful маршруты.

Другое дело с профилями пользователей. Если у одного пользователя может быть только один профиль, лучше объявить единственные маршруты ресурсов:

resources :users do
  resource :profile
end
0 голосов
/ 10 марта 2011

Я не могу объяснить, почему он делает этот запрос SQL, но он не использует 101 для поиска пользователя.Если бы это было так, вы бы получили эту ошибку:

ActiveRecord::RecordNotFound: Couldn't find User with ID=101

Так как он говорит Coundln't find User without and ID, то, вероятно, он вызывает User.find(nil)

В любом случае, мы делаем нечто подобное в нашем приложениикроме как с именами вместо идентификаторов.Они сопоставляются в нижней части файла маршрутов, например:

match '/:current_region' => 'offers#show', :as => 'region_home'

, и затем в вашем контроллере вы можете загрузить модель из параметра params[:current_region]:

def load_region
    @current_region = Region.find_by_slug(params[:current_region] || cookies[:current_region])
end

Мы используем его в качестве фильтра перед множеством действий, поэтому мы определяем его так, а не явно вызываем его в действии show:

class OffersController < ActionController::Base
    before_filter :load_region

    def show
        # do stuff with @current_region here
    end
end

Вам просто нужно изменить :current_region на:id

...