将嵌套资源删除的位置删除到许多关系中



我拥有带有嵌套资源的Rails 4应用程序,而孩子(会话)也与另一个模型(扬声器)有着多一对一的关系。

 resources :parent do
   resources :child
 end
class Parent < ActiveRecord::Base
  has_many :children
end
class Child < ActiveRecord::Base
  belongs_to  :parent
  has_and_belongs_to_many :speakers
end
class Speaker < ActiveRecord::Base
  has_and_belongs_to_many :children
end

我试图弄清哪个控制器应具有关系删除/添加(扬声器)。我可以在Session Controller#Destrot中处理此操作,但必须处理这种关系的特殊情况(感觉不正确)。当前,我有一个自定义的路由sessionController#speaker通过操作参数(:add,:delete)。

我将记录保留在关系的两面,只删除关系

sessions.speakers.delete(speaker)

您认为最好的方法是什么?

  • 在特殊路线中将删除关系保持在session controller中
  • 在特殊路线中添加到SpeakerController
  • 创建一个新的控制器来处理关系

activerecord

要从集合中添加或删除对象,您有<<.delete ActivereCord方法

使用activerecord对象的这些工作,可以这样称呼:

#apps/controller/posts_controller.rb
def comment
    post = Post.find(params[:post_id])
    comment = Comment.find(params[:comment_id])
    #Add
    post.comments << comment
    #Delete
    post.comments.delete(comment)
end

控制器

回答有关哪个控制器的问题,我建议将代码保存在"父"控制器中(在您的情况下,sessions)&amp;创建一种方法来处理该过程

这是我们上周创建的实时代码:

#config/routes.rb
resources :entries do
   match ":category_id", to: :category, via: [:post, :delete], as: "category"
end
#app/controllers/entries_controller.rb 
def category
    entry = Entry.find(params[:entry_id])
    category = Category.find(params[:category_id])
    #Actions
    entry.categories << category if request.post?
    entry.categories.delete(category) if request.delete?
    #Return
    redirect_to collection_path
end

这允许我们调用带有不同:method的单个链接来调用不同的操作:

<%= link_to "Add Category", admin_entry_category_path("60", "20"), method: :post %>

最新更新