Как добавить пользовательский маршрут RESTful в приложение Rails? - PullRequest
21 голосов
/ 14 апреля 2010

Я читаю эти две страницы

  1. resources
  2. Adding more RESTful actions

На странице Rails Guides отображается

map.resources :photos, :new => { :upload => :post }

и соответствующий ему URL

/photos/upload

Это выглядит замечательно.


Мой routes.rb показывает это

map.resources :users, :new => { :signup => :get, :register => :post }

Когда я делаю: [~/my_app]$ rake routes

Я вижу добавленные два новых маршрута

  signup_new_user GET    /users/new/signup(.:format)
register_new_user POST   /users/new/register(.:format)

Примечание Включение /new! Я не хочу этого. Я просто хочу /users/signup и /users/register (как описано в Руководстве по маршрутизации Rails).

Любая помощь?

Ответы [ 4 ]

61 голосов
/ 20 апреля 2010

Когда вы выставляете контроллер как ресурс, автоматически добавляются следующие действия:

show
index
new
create
edit
update
destroy

Эти действия можно разделить на две группы:

  • :member Действия

URL-адрес действия участника содержит идентификатор целевого ресурса. Например:

users/1/edit 
users/1

Вы можете думать о :member действии как о методе экземпляра в классе. Он всегда применяется к существующему ресурсу.

Действия члена по умолчанию: show, edit, update, destroy

  • :collection действия

URL-адрес для действия :collection не содержит идентификатор целевого ресурса. Например:

users/login
users/register

Вы можете думать о :collection действии как о статическом методе в классе.

Действия по умолчанию для сбора: index, new, create

В вашем случае вам нужно два новых действия для регистрации. Эти действия относятся к: типу коллекции (поскольку у вас нет идентификатора пользователя при отправке этих действий). Ваш маршрут может быть следующим:

map.resources :users, :collection => { :signup => :get, :register => :post }

URL-адрес действий:

users/signup
users/register

Если вы хотите удалить стандартное действие, сгенерированное Rails, используйте: кроме /: только опции:

map.resources :foo, :only => :show

map.resources :foo, :except => [:destroy, :show]

Редактировать 1

Обычно я рассматриваю действие confirmation как действие :member. В этом случае params[id] будет содержать код подтверждения.

Конфигурация маршрута:

map.resources :users, :member => { :confirm => :get}

URL

/users/xab3454a/confirm

confirm_user_path(:id => @user.confirmation_code) # returns the URL above

Контроллер

class UsersController < ApplicationController
  def confirm
    # assuming you have an attribute called `confirmation_code` in `users` table 
    # and you have added a uniq index on the column!!
    if User.find_by_confirmation_code(params[id])
      # success
    else
      # error
    end
  end
end
12 голосов
/ 08 февраля 2013

Это может быть воспринято как еще один синтаксис - может быть что-то хорошее, что нужно знать.

Синтаксис 1:

resources :users do
  member do
    get 'signup'
    post 'register'
  end
end

Выход Rake Route будет включать

signup_users GET    /users/signup(.:format)    {:action=>"signup", :controller=>"users"}
register_users POST   /users/register(.:format)  {:action=>"register", :controller=>"use

RS "}

Синтаксис 2: Если у вас есть только один маршрут сбора

resources :users do
    get 'signup', :on => :collection
end
3 голосов
/ 14 апреля 2010

Если я правильно понимаю ваш вопрос, вы просто хотите переименовать URL-адреса действий new и create.

Это будет сделано так:

map.resources :users, :path_names => {:new => 'signup', :create => 'register'}

Если вы действительно хотите добавить новых маршрутов с соответствующими действиями контроллера, тогда ответ Дэмиенса - путь.

1 голос
/ 14 апреля 2010

Опция new позволяет создавать новые маршруты для создания новых объектов. Вот почему они имеют префикс этого термина.

То, что вы ищете, это опция :collection.

map.resources :users, :collection => { :signup => :get, :register => :post }

Что создаст URL-адреса /users/signup и /users/register.

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