Подтвердить что ты не робот

Как добавить настраиваемый маршрут RESTful в приложение Rails?

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

На странице 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 Routing Guide).

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

4b9b3361

Ответ 1

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

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, используйте: except/: only options:

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

Ответ 2

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

Синтаксис 1:

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

Выход рейкового маршрута будет включать

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

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

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

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

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

Ответ 4

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

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

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

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