我拥有带有嵌套资源的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 %>