Путь REST для «нового из копии» - PullRequest
7 голосов
/ 31 августа 2011

Для некоторых моделей я хочу предоставить функциональность, позволяющую пользователю создавать новую запись с атрибутами по умолчанию на основе копии существующей записи.

Мне интересно, каким будет правильный маршрут для отдыхаthis.

Вначале я думал, что это может быть параметром действия new.Т.е. позаимствовать из примеров Rails Guides вместо просто:

GET: / photos / new

Также разрешить:

GET: /photos / new /: id

... где :id - это идентификатор записи для использования в качестве шаблона.Ответом будет новая / редактируемая форма, такая же, как с простой старой new, но значения будут предварительно заполнены данными из существующей записи.Параметр (или его отсутствие) можно легко обработать с помощью метода контроллера new.

Альтернативой может быть создание нового метода контроллера, например copy, который бы также принимал идентификаторсуществующая запись и ответ с новой формой, как указано выше.Это кажется мне немного «неправильным», так как на самом деле запись не копируется , пока пользователь не сохранит новую запись (возможно, после некоторого редактирования).

TIA ...

ОБНОВЛЕНИЕ: мой вопрос не "как мне сделать это в рельсах?", Это "это RESTful?"

Ответы [ 4 ]

3 голосов
/ 31 августа 2011

мой вопрос не "как мне это сделать в рельсах?", Это "это RESTful?"

Нет, это не так. В этом отношении ни один не является GET /photos/new. Rails, кажется, безнадежно погряз в прошлом, когда считалось haute program , чтобы GET на URI возвращал HTML-форму, которая затем отправляла бы данные POST x-www-form-urlencoded в тот же URI , Непрозрачность этого POST заставляет их изобретать новые глаголы как URI, такие как /photos/new, когда вместо этого можно использовать PUT или, по крайней мере, POST с тем же типом носителя.

Простейший способ сделать копию ресурса HTTP RESTful это:

GET /photos/{id}/ -> [representation of a photo resource]
...make modifications to that representation as desired...
POST /photos/ <- [modified representation]

Если вы реализуете это для браузеров, вы сможете довольно легко выполнять эти действия через Ajax, используя HTML-страницу, возможно, на /photos/manager.html/, чтобы управлять взаимодействием с пользователем.

1 голос
/ 01 апреля 2013

Это может быть слишком, но вы можете сделать что-то вроде этого:

class PhotoCopiesController < ApplicationController
  def new
    @photo = Photo.find(params[:photo_id]).dup
  end

  def create
  end
end

и

resources :photo_copies, :only => [:new, :create]

и

= link_to 'Copy', photo_copy_path(:photo_id => @photo.id)
1 голос
/ 31 августа 2011

Вы должны быть в состоянии match маршрут, например, так:

match 'photos/new/:photo_id' => 'photos#new

или вы можете просто передать параметр :photo_id в URL и обработать его в контроллере:

'/photos/new?photo_id=17'

Пример использования вспомогательного метода: new_photo_path(:photo_id => 17)

Редактировать: я не знаю, соответствует ли это REST

1 голос
/ 31 августа 2011

Вы можете попытаться использовать вложенные ресурсы. Я не совсем уверен в структуре вашего приложения, но в целом использование вложенных фотографий будет выглядеть примерно так:

routes.rb

resources :photos do
  resources :photos
end

photos_controller.rb

before_filter :find_parent_photo, :only => [:new, :create]

def create
  @photo = Photo.new params[:photo]
  if @parent_photo.present?
    # fill some @photo fields from @parent_photo
  end
  @photo.save

  respond_with @photo
end

def find_parent_photo
  @parent_photo = Photo.find(params[:photo_id]) if params[:photo_id].present?
end

new.html.haml

= form_for [@parent_photo, @photo] do |f|
  -# your form code

ранее, когда вы хотели добавить ссылку на создание фотографии, вы писали что-то подобное

= link_to "new photo", [:new, :photo]

теперь, если вы хотите добавить ссылку на создание фото на основе фотографии @photo1

= link_to "new photo based on other one", [:new, @photo1, :photo]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...