gpt4 book ai didi

mysql - Rails - 用于创建用户组的 Controller 问题

转载 作者:行者123 更新时间:2023-11-30 22:23:47 26 4
gpt4 key购买 nike

我目前有一个 Rails 应用程序,它允许用户创建一个组并允许其他用户加入该组。组“创建者”是组的所有者,任何根据请求加入的都是成员。我希望用户只能创建一个组,但属于多个组(我认为我已经捕捉到了这种关系,但我有点不确定)。我需要一些帮助来了解我需要做什么才能在用户页面上显示组关联。我应该如何创建组“显示”页面以及如何在用户“显示”页面上显示组成员资格?我从 SO 那里得到了帮助,并遵循 Railscast on self-referential association 来帮助指导我建立关系。

在此示例中,组称为 Cliq,成员资格由 has_many :through 控制。我为用户模型使用了 Devise。

澄清我的问题:我是否捕捉到我试图建立的关系?我将如何允许用户查看他们所属的组?

顺便说一句,我不确定群组创建者是否被关联为群组成员。我如何在我的模型/ Controller 中表示它?

这是我的代码:

组模型:

class Cliq < ActiveRecord::Base
belongs_to :owner, class_name: 'User'

has_many :members, through: :cliq_memberships, source: :user
has_many :cliq_memberships
end

成员(member)模式:

class CliqMembership < ActiveRecord::Base
belongs_to :cliq
belongs_to :user
end

用户模型:

class User < ActiveRecord::Base
has_one :owned_group, foreign_key: 'owner_id', class_name: 'Group'

has_many :cliqs, through: :cliq_memberships
has_many :cliq_memberships
.
.
.
end

组 Controller :

    class CliqsController < ApplicationController

def show
@cliq = Cliq.find(params[:id])
end

def new
@cliq = Cliq.new(params[:id])
end

def create
@cliq = Cliq.create(cliq_params)
if @cliq.save
redirect_to current_user
else
redirect_to new_cliq_path
end
end

def destroy
end

def cliq_params
params.require(:cliq).permit(:name, :cliq_id)
end
end

组成员 Controller :

class CliqMembershipsController < ApplicationController

def create
@cliq = cliq.find(params[:cliq_id])
if @cliq_membership.save = current_user.cliq_memberships.build(:cliq_id => params[:cliq_id])
flash[:notice] = "Joined #{@cliq.name}"
else
#Set up multiple error message handler for rejections/already a member
flash[:notice] = "Not able to join Cliq."
end
redirect_to cliq_url
end

def destroy
@cliq = Cliq.find(params[:id])
@cliq_memberships = current_user.cliq_memberships.find(params[cliq_memberships: :cliq_id]).destroy
redirect_to user_path(current_user)
end
end

还有我的用户显示页面:

    <h1> <%= @user.username %> </h1>

<h2>Cliqs</h2>

<%= link_to "Create Cliq", new_cliq_path %>

<ul>
<% for cliq_membership in @user.cliq_memberships %>
<li>
<%= cliq_membership.cliq.name %>
(<%= link_to "Leave Cliq", cliq_membership, :method => :delete %>)
</li>
<% end %>
</ul>

<h3>Title:</h3>
<% @uploads.each do |upload| %>
<div>
<%= link_to upload.title, upload_url %>
</div>
<% end %>

还有我的迁移:

Cliq:

class CreateCliqs < ActiveRecord::Migration
def change
create_table :cliqs do |t|

t.string :name
t.references :owner
t.integer :cliq_id

t.timestamps null: false
end
end
end

Cliq 成员(member)资格:

    class CreateCliqMemberships < ActiveRecord::Migration
def change
create_table :cliq_memberships do |t|
t.references :user
t.references :cliq

t.timestamps null: false
end
end
end

以下工作的完整解决方案。

最佳答案

尝试以下操作:

您修改后的模型。修复了以下问题:

User 模型中,对于 has_one :owned_group,您将 class_name 设置为 Group 而不是 Cliq

has_many :through 之前声明has_many。它可能会以其他方式工作,但这是一种很好的做法并且易于阅读。

class User < ActiveRecord::Base
has_one :owned_group, foreign_key: 'owner_id', class_name: 'Cliq'
has_many :cliq_memberships
has_many :cliqs, through: :cliq_memberships
end

class CliqMembership < ActiveRecord::Base
belongs_to :cliq
belongs_to :user
end

class Cliq < ActiveRecord::Base
belongs_to :owner, class_name: 'User'
has_many :cliq_memberships
has_many :members, through: :cliq_memberships, source: :user
end

您修改后的 Controller 。修复了以下问题:

CliqsController 中,由于它与 Cliq 相关,因此在创建它时不会获得 cliq_id。所以从 cliq_params 中删除了 cliq_id。您可以在其中添加其他 cliq 相关属性。

create 中,您忘记将 current_user 指定为 cliq 的所有者。这将在下一条注释中解决。

由于 usercliq 的所有者,因此使用 build_owned_group 构建了 cliq,它会自动设置current_user 作为所有者。

尽量不要在同一条语句中做多件事。就像将它分配给一个变量以及对新分配的变量进行一些操作一样。例如:在 CliqMembershipsControllercreate 操作中,您分配了 @cliq_membership 并对其调用了 save .将这两者分成两步。

CliqMembershipsControllerdestroy 中,无需加载 @cliq 并且还修复了查找 的方式@cliq_membership.

class CliqsController < ApplicationController

def show
@cliq = Cliq.find(params[:id])
end

def new
@cliq = Cliq.new(params[:id])
end

def create
@cliq = current_user.build_owned_group(cliq_params)

if @cliq.save
redirect_to current_user
else
redirect_to new_cliq_path
end
end

private
def cliq_params
params.require(:cliq).permit(:name)
end
end

class CliqMembershipsController < ApplicationController

def create
@cliq = Cliq.find(params[:cliq_id])
@cliq_membership = current_user.cliq_memberships.build(cliq: @cliq)

if @cliq_membership.save
flash[:notice] = "Joined #{@cliq.name}"
else
#Set up multiple error message handler for rejections/already a member
flash[:notice] = "Not able to join Cliq."
redirect_to cliq_url
end

def destroy
@cliq_membership = current_user.cliq_memberships.find(params[:id])

if @cliq_membership.destroy
redirect_to user_path(current_user)
end
end
end

最后是你修改后的观点:

修复了一些问题。

尝试在集合上使用 each 进行迭代。这是更 ruby 的方式,而不是 for 循环。

根据您的 CliqMemberhipsController 代码,我假设您正在使用如下的嵌套资源。因此修复了 link_to 以使用 cliq_cliq_memberhip_path 而不是 cliq_membership_path

<h1><%= @user.username %></h1>

<h2>Cliqs</h2>

<%= link_to "Create Cliq", new_cliq_path %>

<ul>
<% @user.cliq_memberships.each do |cliq_membership| %>
<li><%= cliq_membership.cliq.name %>(<%= link_to "Leave Cliq", cliq_cliq_membership_path([cliq, cliq_membership]), method: :delete %>)</li>
<% end %>
</ul>

假设您有一个包含以下内容的路由文件:

resources :cliqs do
resources :cliq_memberships
end

关于mysql - Rails - 用于创建用户组的 Controller 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35929930/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com