【发布时间】:2017-05-24 04:40:44
【问题描述】:
在我的 Ruby on Rails 应用程序中,我试图实现 Group 和 Contact 之间的关系,一个组可以包含多个联系人,一个联系人可以是多个组的一部分。我正在使用一个名为 Contactgroup 的模型来处理这种关系,所以表格是:
Group (id, name)
Contact (id, firstname, surname)
Contactgroup (group_id, contact_id)
示例数据为:
Groups:
ID Name
1 Singers
2 Drummers
Contacts:
ID Firstname Surname
1 Freddy Mercury
2 Roger Taylor
3 Kurt Cobain
4 Dave Grohl
Contact Groups:
Group_ID Contact_ID
1 1
1 3
1 4
2 2
2 4
我想要做的是得到它,这样当用户创建一个组时,他们可以选择他们想要添加到该组的联系人。这意味着存在组表单,用户可以在其中键入组名称,并且在此表单上,我想为每个用户的联系人显示复选框,以便用户可以选择他们想要添加到组中的联系人,以及何时他们点击提交新组将保存在组表中,新的联系人组记录将保存在联系人组表中。
这是app/views/groups/_form.html.erb 代码:
<%= form_for @group do |f| %>
<% if @group.errors.any? %>
<div id="error_explanation">
<h2>
<%= pluralize(@group.errors.count, "error") %> prohibited this group from being saved:
</h2>
<ul>
<% @group.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<p>
<%= f.label :name %><br>
<%= f.text_field :name %>
</p>
<h2>Add members:</h2>
<%= form_for([@group, @group.contactgroups.build]) do |f| %>
<p>
<%= f.collection_check_boxes(:contact_id, @contacts, :id, :firstname) %>
</p>
<p>
<%= f.submit %>
</p>
<% end %>
<p>
<%= f.submit %>
</p>
<% end %>
在这里,您可以看到我尝试使用的代码:
<h2>Add members:</h2>
<%= form_for([@group, @group.contactgroups.build]) do |f| %>
<p>
<%= f.collection_check_boxes(:contact_id, @contacts, :id, :firstname) %>
</p>
<p>
<%= f.submit %>
</p>
<% end %>
<p>
<%= f.submit %>
</p>
<% end %>
我从 rails guides (http://guides.rubyonrails.org/getting_started.html) 得到了这个,但我收到了错误 undefined methodcontactgroups' 的 #` 并且不认为这会给我想要的东西。
我的路线文件是:
Rails.application.routes.draw do
get 'sessions/new'
get 'sessions/create'
get 'sessions/destroy'
resources :users
get 'welcome/index'
root 'welcome#index'
resources :contacts
resources :groups do
resources :contactgroups
end
resources :contactgroups
get 'sessions/new'
get 'sessions/create'
get 'sessions/destroy'
controller :sessions do
get 'login' => :new
post 'login' => :create
get 'logout' => :destroy
end
end
我的 groups_controller:
class GroupsController < ApplicationController
def index
@groups = Group.where(user_id: session[:user_id])
end
def show
@group = Group.find(params[:id])
@members = Contactgroup.where(group_id: @group.id)
end
def new
@group = Group.new
@contacts = Contact.where(user_id: session[:user_id])
end
def edit
@group = Group.find(params[:id])
end
def create
@group = Group.new(group_params)
@group.user_id = session[:user_id]
if @group.save
redirect_to @group
else
render 'new'
end
end
def update
@group = Group.find(params[:id])
if @group.update(group_params)
redirect_to @group
else
render 'edit'
end
end
def destroy
@group = Group.find(params[:id])
@group.destroy
redirect_to groups_path
end
private
def group_params
params.require(:group).permit(:name, :user_id)
end
end
还有contactgroups_controller:
class ContactgroupsController < ApplicationController
def destroy
@contactgroup = Contactgroup.find(params[:id])
@contactgroup.destroy
redirect_to(:back)
end
end
我的模型如下:
Contact.rb:
class Contact < ActiveRecord::Base
end
Group.rb:
class Group < ActiveRecord::Base
end
Contactgroup.rb:
class Contactgroup < ActiveRecord::Base
belongs_to :contact
belongs_to :group
end
必须有一个简单的解决方案来解决这个问题,因为我假设它通常在其他系统上完成,但我不知道如何做到这一点。
有人可以帮忙吗。
【问题讨论】:
-
有一个“在 Rails 中连接表”和“拥有并属于许多”的 google - Rails 为您提供了很好的帮助方法,这意味着您不必自己手动处理连接表(即你所谓的
Contactgroup是为你处理的)。还要查看“嵌套资源”和“嵌套表单”。同样,rails 也有一些很好的帮手为您完成繁重的工作:) -
@TarynEast 感谢您的评论。我知道 Rails 有很多关系并且属于许多关系,这可以在 Ruby 中完成,但为了它的透明度,我想使用连接表。我会谷歌嵌套表单,因为我认为这是我想要的?
-
只是好奇:重用 rails 已经编写的用于处理此问题的代码是否更加透明? :)
-
因为我可以在 SQL 浏览器中实际看到数据,只是让错误检查更容易
-
我可能没有说得很好,我的意思是我认为将记录保存在一个表格中的不同模型的表格中是很常见的
标签: ruby-on-rails ruby forms ruby-on-rails-3 ruby-on-rails-4