Маршруты Rails, проблема с кастомами: действие не распознается, всегда «показывать» - PullRequest
0 голосов
/ 28 июня 2010

Я пытаюсь «управлять» пользователями вместо «новых» и «показывать» пользователей с помощью действий. Я подозреваю, что проблема где-то в маршрутах, так как моя ссылка '/ users / manage' принимается в качестве параметра id для действия 'show':

Терминальный журнал процесса:

Processing UsersController#show (for 127.0.0.1 at 2010-06-28 00:31:45) [GET]
  Parameters: {"id"=>"manage"}

ActionController::UnknownAction (No action responded to show. Actions: create, destroy, index, manage, and update):

Вот некоторые фрагменты кода соответствующих частей:

users / index.html.erb (ссылка, созданная для перехода в раздел управления, т. Е. '/ Users / manage'):

<%= link_to('New User', :action => 'manage') %>

users_controller.rb (предполагается, что получает действие «управление», но получает «show» от вызова выше:

def index
    @users = User.all

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @users }
    end
  end

  def manage
      @users = User.all
      @user = User.find(params[:id]) if params[:id]
    @user = User.new if @user.nil?

    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @user }
    end
  end

Ruby / rails видит '/ users / manage' как ': controller /: action /: id' т.е. 'users / show / 1' .

При использовании '/ users / manage / 1' для редактирования одного пользователя, правильное: действие (как «manage») загружается через функцию «manage» UsersController, и все отображается редактировать из файла manage.html.erb. UsersController видит «управлять», а не «показывать», правильно, в его случае, но только из-за того, что: id передается, заставляя и работает маршрут:: controller /: action /: id.

'users / manage',: controller /: action , похоже, является проблемой , , не признающей 'manage' как действительное: только действие: вместо отправки как: id в 'show' ...

routes.rb

ActionController::Routing::Routes.draw do |map|
  map.resources :users
  map.resources :categories
  map.resources :posts
  map.connect ':controller/:action'
  map.connect ':controller/:action/:id'
  map.connect ':controller/:action/:id.:format'
end

Может кто-нибудь помочь мне решить эту проблему?

Почему действие 'show' выполняется автоматически? Можно ли заставить «пользователей» и «управлять» на маршрутах распознавать в контроллере как «управлять», а не как «показывать»?

Спасибо за помощь людям:)

Мир.

EDIT рейковые маршруты

$ rake routes
(in /home/krnel/sites/rails_projects/simple_blog)
        users GET    /users(.:format)                   {:action=>"index", :controller=>"users"}
              POST   /users(.:format)                   {:action=>"create", :controller=>"users"}
     new_user GET    /users/new(.:format)               {:action=>"new", :controller=>"users"}
    edit_user GET    /users/:id/edit(.:format)          {:action=>"edit", :controller=>"users"}
         user GET    /users/:id(.:format)               {:action=>"show", :controller=>"users"}
              PUT    /users/:id(.:format)               {:action=>"update", :controller=>"users"}
              DELETE /users/:id(.:format)               {:action=>"destroy", :controller=>"users"}
   categories GET    /categories(.:format)              {:action=>"index", :controller=>"categories"}
              POST   /categories(.:format)              {:action=>"create", :controller=>"categories"}
 new_category GET    /categories/new(.:format)          {:action=>"new", :controller=>"categories"}
edit_category GET    /categories/:id/edit(.:format)     {:action=>"edit", :controller=>"categories"}
     category GET    /categories/:id(.:format)          {:action=>"show", :controller=>"categories"}
              PUT    /categories/:id(.:format)          {:action=>"update", :controller=>"categories"}
              DELETE /categories/:id(.:format)          {:action=>"destroy", :controller=>"categories"}
        posts GET    /posts(.:format)                   {:action=>"index", :controller=>"posts"}
              POST   /posts(.:format)                   {:action=>"create", :controller=>"posts"}
     new_post GET    /posts/new(.:format)               {:action=>"new", :controller=>"posts"}
    edit_post GET    /posts/:id/edit(.:format)          {:action=>"edit", :controller=>"posts"}
         post GET    /posts/:id(.:format)               {:action=>"show", :controller=>"posts"}
              PUT    /posts/:id(.:format)               {:action=>"update", :controller=>"posts"}
              DELETE /posts/:id(.:format)               {:action=>"destroy", :controller=>"posts"}
 manage_users GET    /users/manage(.:format)            {:action=>"manage", :controller=>"users"}
              GET    /users(.:format)                   {:action=>"index", :controller=>"users"}
              POST   /users(.:format)                   {:action=>"create", :controller=>"users"}
              GET    /users/new(.:format)               {:action=>"new", :controller=>"users"}
              GET    /users/:id/edit(.:format)          {:action=>"edit", :controller=>"users"}
              GET    /users/:id(.:format)               {:action=>"show", :controller=>"users"}
              PUT    /users/:id(.:format)               {:action=>"update", :controller=>"users"}
              DELETE /users/:id(.:format)               {:action=>"destroy", :controller=>"users"}
                     /:controller/:action/:id           
                     /:controller/:action/:id(.:format) 

Ответы [ 3 ]

6 голосов
/ 28 июня 2010

На самом деле вы никогда не определяете действие «управлять».Вы являетесь , однако отображаете / users, / users /: id, / users /: id / edit и еще несколько (отправьте, поместите, удалите) маршруты, выполнив map.resources: users.Проверьте свой rake routes, чтобы узнать, что именно вы наметили.

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

map.resources :users, :collection => {:manage => :get}

Этодобавит / users / management GET route для вашего действия.Таким образом, вы можете добавить: member (s) или: collection (s).Разница в том, что участник будет ожидать: id будет предоставлен, а сбор не будет.

Подробнее в руководстве по маршрутизации рельсов: http://guides.rubyonrails.org/routing.html

Правильный путь

Что вы, вероятно, хотите сделать, - это создать пространство имен Admin для управления пользователями.Тогда ваши пользователи будут доступны через / admin / users, / admin / users /: id, / admin / users /: id / edit и т. Д. Таким образом, вы можете отделить интерфейс, в котором вы управляете пользователями, от одного.где пользователи редактируют свои собственные профили.Это лучшая практика, потому что таким образом вам не нужно придумывать собственные маршруты, такие как / users / manage.Он предоставит область CRUD для администрирования, не связанную с областью CRUD для самих пользователей.

2 голосов
/ 06 августа 2015

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

resources :users do
    collection do
      get 'manage'
    end
end
0 голосов
/ 28 июня 2010

Если вы хотите переименовать ваши маршруты, используйте: path_names hash в ваших маршрутах, как этот.

map.resources :photos, :path_names => { :new  => 'make', :edit  => 'change' } 

Это приведет к маршрутизации распознавать такие URL, как

/photos/make
/photos/1/change 

Фактические имена действий не изменяются этой опцией; показанные два URL будут по-прежнему направлять к новым и редактировать действия.

См. Это руководство для получения дополнительной информации: http://guides.rubyonrails.org/routing.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...