RubyOnRails - 用户通过成员身份加入群组

时间:2014-07-29 05:49:44

标签: ruby-on-rails ruby-on-rails-4 rails-activerecord

我仍然是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中做起来很容易的事情。

2 个答案:

答案 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

enter image description here


这不是最有效的,或者可能是&#34;正确的&#34;这样做的方式,但应该给你一些工作

答案 1 :(得分:0)

错误消息表示@membership为nil或[]。您应该检查以下行,看看为什么会发生这种情况。可能@group不存在

@group = Group.find_by_name(:group)
@membership = current_user.memberships.build(:group_id => @group.group_id)