0

我有一个 Post 模型

has_many photos 

Post 模型有

accepts_nested_attributes_for :photos

在我的帖子编辑表单中,我显示了当前与帖子关联的所有图像

<% 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,但这是意料之中的,因为没有。

我的问题是我是否创建一个并在那里进行破坏操作,只会删除该照片..这是解决方法还是有更好的方法?

编辑

照片控制器

 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

耙子路线

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

谢谢

4

2 回答 2

3

您描述的选项,调用destroya 的动作PhotosController,肯定会成功,并且可能是更简单和更快的解决方案。请注意,如果用户对帖子的其他方面进行了更改,然后单击链接以删除同一表单中的照片,则他们的更改可能会丢失。但是,使用 AJAX 可能有助于缓解这种担忧。

另一种选择是利用 rails 对嵌套表单的现有支持。因为您已经在使用嵌套表单,而accepts_nested_attributes_for您已经完成了一半。如果您还没有看到这个,请查看 Ryan Bates 在嵌套表单上的播客:

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

您感兴趣的肉和土豆是在播客的中间到末尾,Ryan 使用_destroy嵌套元素参数中的隐藏字段向控制器指示,而不是当父对象更新时,嵌套关联应该是被摧毁。

您还可以找到一个现成的 gem,它包含了 Ryan 从头开始​​实现的相同 Rails/Javascript 功能。我过去用过,非常满意。

这种技术稍微复杂一些,但在这种情况下我更喜欢它,因为表单的重点是修改帖子,而不是照片。在第一个解决方案中,您必须将PhotosController#destroy操作重定向回表单。或者,如果您使用 AJAX,那么您将不得不编写适合您的 Post HTML 布局的 javascript,以便在元素被销毁后正确隐藏/删除该元素。这对于小型应用程序可能没问题,但是随着项目的增长,您可能会发现自己尝试将其PhotosController用于其他工作流程,并且可能会变得难以维护。

于 2013-04-05T22:04:43.420 回答
1

我的观点是,最好的办法是创建一个PhotosController来处理销毁动作。这样,您将保留单一职责原则,并减少添加自定义路由的解决方法。

PostsController此外,如果您确实确定不会添加与照片相关的任何其他操作(例如标记照片或其他),则可以选择将该操作放入其中。

这真的取决于你,但我相信第一个更容易。

如果您选择第二个选项,请务必在 中为销毁照片操作创建路线,PostsController并且链接应指向该确切操作。

你的routes.rb

resources :posts do
   resources :photos, :only => [:destroy]
   resources :departments
end
于 2013-04-05T21:53:35.520 回答