Как правильно маршрутизировать REST с несколькими точками входа? - PullRequest
0 голосов
/ 19 июля 2011

У меня есть модель Project, которая представляет собой набор информации, хранящейся в компании. Эта компания может создавать проекты двумя способами.

Первый - это стандартный способ RESTful - компания переходит к индексу проекта, затем нажимает «Новый проект» и после создания возвращается к индексу с флэш-сообщением.

Вторым является «быстрое создание», к которому можно получить доступ, когда компания просматривает профиль клиента. Отсюда компания может ввести некоторую базовую информацию и отправить ее, чтобы создать проект с этим клиентом (клиент указывается здесь автоматически).

Второй из этих двух сценариев имеет доступ к проекту из клиентов / шоу. Отправка этих данных в проекты / создание обычно направляет компанию к проектам / индексам, но я этого не хочу. В этом случае действие create существенно отличается тем, что некоторые поля обрабатываются по-разному, и перенаправление также отличается. Что бы вы посоветовали мне сделать?

  1. Создание альтернативного действия 'create_from_client' в проектах.
  2. Создание действия create_project на клиентах.
  3. Отправить параметр в проекты / создать и установить client_id и перенаправить на клиента / показать, если этот параметр существует.
  4. Что-то еще, что я не знаю.

Спасибо!

Ответы [ 3 ]

1 голос
/ 19 июля 2011

Вы можете использовать реферер непосредственно из объекта Request и его форка, основываясь на этом, подобно тому, как работает redirect_to :back.

Из документации по Rails API для хеша параметров redirect_to:

: назад - Вернуться на страницу, с которой был отправлен запрос.Полезно для форм, которые запускаются из нескольких мест.Сокращение для redirect_to (request.env ["HTTP_REFERER"])

Так что вы можете просто сделать что-то вроде этого:

def create
  @project = Project.new( params[:project] )
  @project.save
  respond_with @project, location: get_location!
end

private

def get_location!
  case request.env["HTTP_REFERER"]
  # Your routing logic here.
end

Это хорошо и легко для модульного тестатоже, если вы в этом.:)

context "if the user came from the regular form" do
  before { controller.request.env["HTTP_REFERER"] = "regular_form_url" }

  it "redirects to the index path" do
    post :create
    response.should redirect_to :index
  end
end

context "if the user came from the quick-create form" do
  before { controller.request.env["HTTP_REFERER"] = "quick_create_url" }

  it "redirects to some other path" do
    post :create
    response.should redirect_to some_other_path
  end
end
0 голосов
/ 19 июля 2011

Я бы просто добавил другое действие в контроллер, 'quick_create' или что-то еще.Вы можете высушить форму с частями и параметрами до частичного, чтобы сказать, как визуализировать вещи ... Это просто кажется самым простым способом.

У меня есть этот полурациональный (или это полуиррационально) повесить трубку от привлечения реферера ...

0 голосов
/ 19 июля 2011

Я обычно добавляю скрытое referer поле с текущим URL, затем перенаправляю на него

Например

def create
  @project = Project.new params[:project]
  @project.save
  respond_with @project, :location => params[:referer] || [:index, :projects]
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...