【发布时间】:2022-08-18 06:09:48
【问题描述】:
我是 Rails 的新手,我有一个问题。我正在编写一个 Rails 应用程序来组织小组活动。我已经实现了组通知的控制器(当一个新成员被包含到组中时,他/她收到了一个通知)。我想为创建的新投票创建通知机制。我需要一个新的控制器还是可以使用相同的控制器?
标签: ruby-on-rails
我是 Rails 的新手,我有一个问题。我正在编写一个 Rails 应用程序来组织小组活动。我已经实现了组通知的控制器(当一个新成员被包含到组中时,他/她收到了一个通知)。我想为创建的新投票创建通知机制。我需要一个新的控制器还是可以使用相同的控制器?
标签: ruby-on-rails
如果你真的想要自定义控制器,你当然可以。
但是,我发现它们使事情变得更加混乱,因为它们不遵循标准结构,而且我经常忘记它们以及我制作它们的原因。
我会尽力坚持让控制器与我的模型相匹配的做法。
这是我构建应用程序的方式:
楷模:
控制器:用于创建、显示、列出、更新、删除记录等操作
当做的不仅仅是基本的CRUD 操作时,我会关注什么是“主”或“父”对象,看看我是否可以让它适合 CRUD 操作。
所以让我们以你的例子为例将成员添加到组:
如果您有一个member 的表单,您可以在其中选择现有的group,或者甚至可以创建一个新的group,我会说member 是“主要”对象,我会使用MembersController#create和MembersController#update 操作。我会使用accepts_nested_attributes:
class Member < ApplicationRecord
has_many :groups
accepts_nested_attributes_for :groups
end
如果您有相反的情况(添加或删除成员的group 表单),我会翻转它,使用带有嵌套属性的GroupsController#create 和GroupsController#update。
class Group < ApplicationRecord
has_many :members
accepts_nested_attributes_for :members
end
这样你的路线就非常标准:
resources :members
resources :groups
resources :polls
您可以将相同的逻辑用于投票通知。
Poll 将是主要对象,因此您可以在 PollsController#create 和 PollsController#update 中处理此逻辑
如果你想摆脱RESTful routes,我仍然会使用这些控制器。
例如。:
# routes
resources :members do
get 'choose_group' #<- the view with the form to choose a group
post 'add_to_group' #<- the controller action to receive the form data
end
# controller
class MembersController < ApplicationController
def choose_group
@member = Member.find(params[:id]
@groups = Group.all
end
def add_to_group
@member = Member.find(params[:id]
@member.groups << Group.find(params[:group_id]
if @member.save
redirect_to 'some/other/place'
else
render 'choose_group'
end
end
end
【讨论】: