我仍然是Rails的新手,所以我发现这令人沮丧。我正在尝试将一个小应用程序作为个人项目的一部分,让用户可以创建并加入其他组。
我查看了StackOverflow,发现了两个类似的问题,答案并没有完全解决我的问题(我甚至尝试使用他们的代码,但仍然无法弄清楚如何解决这个问题。)
这些SO链接在这里:
How do I create a join action between a group and a user?
creating a join action between user and group correctly
我要做的是弄清楚控制器操作和允许用户创建和加入组的erb
代码。以下是我在SO上反复阅读的两篇文章,我曾尝试过使用他们的代码,但不断获得
First argument in form cannot contain nil or be empty
代表
<%= form_for(@membership) do |f| %>
当我在我列出的第二篇SO帖子中使用membership_controller
代码时,出现了这个错误。以下是我到目前为止的模型,我也是在SO的帮助下写的。
user.rb(model)
class User < ActiveRecord::Base
has_many :memberships, :dependent => :destroy
has_many :groups, :through => :memberships
membership.rb(模特)
class Membership < ActiveRecord::Base
attr_accessible :user_id, :group_id
belongs_to :user
belongs_to :group
group.rb(模特)
class Group < ActiveRecord::Base
has_many :memberships, :dependent => :destroy
has_many :users, :through => :memberships
老实说,我无法弄清楚如何连接这三个模型,我已经看过一些例子,现在试着为自己考虑好几个小时了。
如果你能提供帮助,我将非常感激。我只是把我的头发拉出去试图获得一些我知道在Rails中做起来很容易的事情。
答案 0 :(得分:1)
我只是详细说明我会做什么:
#config/routes.rb
resources :groups, only: [:show], shallow: true do
resources :memberships, only: [:new] #-> domain.com/2/memberships/new
end
这会将您发送到memberships
控制器,您可以看起来像这样:
#app/controllers/memberships_controller.rb
Class MembershipsController < ApplicationController
def new
@group = Group.find params[:group_id]
@membership = Membership.new({group: group})
end
def create
@group = Group.find params[:group_id]
@membership = Membership.new(membership_params)
end
private
def membership_params
params.require(:membership).merge(group_id: params[:group_id], user_id: current_user.id)
end
end
这将允许您创建以下表单:
#app/views/memberships/new.html.erb
<% if user_signed_in? %>
<% if current_user.groups.include?(@group) %>
You're already a member of this group!
<% else %>
<%= form_for [@group, @membership] do |f| %>
<%= f.submit "Join" %>
<% end %>
<% end %>
<% end %>
-
您的模型设置为has_many :through
关联(允许您直接影响连接模型):
#app/models/user.rb
Class User < ActiveRecord::Base
has_many :memberships
has_many :groups, through: :memberships
end
#app/models/membership.rb
Class Membership < ActiveRecord::Base
belongs_to :group
belongs_to :user
end
#app/models/group.rb
Class Group < ActiveRecord::Base
has_many :memberships
has_many :users, through: :memberships
end
这不是最有效的,或者可能是&#34;正确的&#34;这样做的方式,但应该给你一些工作
答案 1 :(得分:0)
错误消息表示@membership
为nil或[]。您应该检查以下行,看看为什么会发生这种情况。可能@group
不存在
@group = Group.find_by_name(:group)
@membership = current_user.memberships.build(:group_id => @group.group_id)