2013-04-05 159 views
0

我有删除嵌套属性轨

has_many photos 

桩模型具有

accepts_nested_attributes_for :photos 

在我的岗位的编辑形式-i显示了当前与帖子相关联的所有图像的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,但这是因为没有一个。

我的问题是我创建一个,并在那里有一个销毁行动,只会删除该照片..这是有关它的方式还是有更好的方式?

编辑

照片控制器

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) 

感谢

回答

1

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

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

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

如果您选择第二种方式,请务必为PostsController中的销毁照片操作创建一条路线,并且该链接应指向该确切操作。

routes.rb

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

谢谢,ive添加了我的照片控制器摧毁方法,只是你的正规摧毁行动? – Richlewis 2013-04-05 21:58:12

+0

是的,不要忘了添加它的路线,如: '资源:照片,:只有=> [:销毁]' – Zippie 2013-04-05 22:02:01

+0

谢谢,我添加了我的路线,我还添加:only => [摧毁]照片? – Richlewis 2013-04-05 22:04:25

3

的选项,您所描述的,调用PhotosControllerdestroy行动,肯定会做的伎俩,并很可能会更简单和更快的解决方案。请注意,如果用户对帖子的其他方面进行了更改,然后单击链接以删除相同表单中的照片,则其更改可能会丢失。但是,使用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

的你感兴趣的是什么向中部到瑞安使用嵌套元素的PARAMS隐藏_destroy领域的播客结束的香饽饽,以指示控制器比当父对象时更新后,嵌套关联应该被销毁。

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

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

+0

谢谢@Keith这是一个非常有用的答案,我肯定会研究,回到编辑表单删除后证明是一个问题,路由是edit_post_path,但我不能找到邮政ID错误 – Richlewis 2013-04-05 22:09:29