0

У меня есть модель Post, чтоУдалить вложенный атрибут рельсы

has_many photos 

модель Post имеет

accepts_nested_attributes_for :photos 

В моей Post форме редактирования я показать все изображения, которые в настоящее время связаны с постом

<% for photo in @post.photos %> 
    <%= image_tag(photo.avatar.url(:thumb)) %> <%= link_to "Remove Photo", post_photo_path(@post, photo), :method => :delete %> 
<% end %> 

При наведении указателя мыши на ссылку «Удалить фотографию» путь выглядит так:

http://localhost:3000/posts/17/photos/45 

Я получаю неинициализированный постоянный объект PhotosController, но это ожидается, поскольку его нет.

Мой вопрос заключается в том, что я создаю один, и у меня есть действие уничтожения, которое просто удалит эту фотографию. Разве это путь к этому, или есть лучший способ?

EDIT

Фотографии Контроллер

def destroy 
    @photo = Photo.find(params[:id]) 
    @photo.destroy 
    redirect_to edit_post_path, :notice => "Successfully deleted Photo" 
end 

Маршруты

resources :posts do 
resources :photos 
resources :departments 
end 

Rake Маршруты

edit_post GET /posts/:id/edit(.:format) 

Благодаря

ответ

1

Мое мнение таково, что лучше всего было бы создать PhotosController для обработки действия уничтожения. Таким образом, вы сохраните принцип единой ответственности, и у вас будет меньше обходного пути с добавлением пользовательских маршрутов.

Кроме того, есть возможность поставить это одно действие в PostsController, если вы действительно уверены, что не будете добавлять какие-либо дополнительные действия, связанные с фотографиями (например, пометки фотографий или что-то еще).

Это действительно зависит от вас, но я считаю, что первое проще.

Если вы идете со вторым вариантом, обязательно создайте маршрут для действия по уничтожению фото в PostsController, и ссылка должна указывать на то точное действие.

Ваш routes.rb:

resources :posts do 
    resources :photos, :only => [:destroy] 
    resources :departments 
end 
+0

спасибо, ive добавил мой фотоконтроллер Метод уничтожения, просто ваше обычное действие уничтожения? – Richlewis

+0

да, и не забудьте добавить его в маршруты вроде: 'resources: photos,: only => [: destroy]' – Zippie

+0

спасибо, ive добавил мои маршруты, я все еще добавляю: only => [: уничтожить] фотографии? – Richlewis

3

Опция вы описали, вызывая destroy действие PhotosController, конечно, будет делать трюк, и, вероятно, будет проще и быстрее решение. Будьте осторожны, если пользователь вносит изменения в другие аспекты сообщения, а затем нажимает на ссылку для удаления фотографии в той же форме, их изменения, вероятно, будут потеряны. Однако использование AJAX может помочь смягчить эту проблему.

Другим вариантом было бы использовать рельсы для поддержки вложенных форм. Поскольку вы уже используете вложенную форму с accepts_nested_attributes_for, вы уже на полпути.Если вы еще не видели этого еще, проверить подкасты Райан Бейтс на Вложенных формах:

http://railscasts.com/episodes/196-nested-model-form-part-1
http://railscasts.com/episodes/197-nested-model-form-part-2

И если вы готовы платить (поверьте, это того стоит), пересмотренных решение немного лучше:
http://railscasts.com/episodes/196-nested-model-form-revised

мясо и картофель, что вы заинтересованы в том, к середине до конца подкаста, где Райан использует скрытые _destroy поле Params вложенного элемента, чтобы указать на контроллера, чем когда родительский объект обновление, вложенная связь должна быть уничтожена.

Вы также можете найти драгоценный камень с полки, который обертывает ту же функциональность Rails/Javascript, которую Райан реализовал с нуля. Я использовал cocoon в прошлом и был очень доволен.

Этот метод немного сложнее, но я предпочитаю его в этом случае, потому что фокус формы заключается в изменении сообщения, а не фотографии. В первом решении вам нужно будет вернуть действие PhotosController#destroy обратно в форму. Или, если вы используете AJAX, вам нужно будет написать javascript, который был бы адаптирован к макету вашего Post HTML, чтобы правильно скрыть/удалить элемент после его уничтожения. Это может быть хорошо для небольших приложений, но по мере роста проекта вы можете попытаться использовать тот же самый PhotosController для других рабочих потоков, и это может стать хрупким для обслуживания.

+0

Спасибо @Keith, что это очень полезный ответ, то, что я обязательно рассмотрю, возврат к форме редактирования после удаления является проблемой, маршрут - edit_post_path, но я не могу найти сообщение с ошибкой ID – Richlewis