Ruby on rails 销毁一个has\u many:through不使用链接\u到帮助程序
我正在Rails 4中开发一个简单的项目管理工具,让我头疼的部分有三个主要模型:Ruby on rails 销毁一个has\u many:through不使用链接\u到帮助程序,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在Rails 4中开发一个简单的项目管理工具,让我头疼的部分有三个主要模型:项目、用户和成员身份 用户可以有很多项目,项目可以有很多用户。我通过以下方式实现了项目和用户之间的成员关系: 项目: class Project < ActiveRecord::Base has_many :memberships has_many :users, through: :memberships end rake routes表示成员资格路径存在,但以下尝试给出了答案: 我尝试使用指向帮助
项目
、用户
和成员身份
用户可以有很多项目,项目可以有很多用户。我通过以下方式实现了项目和用户之间的成员关系:
项目:
class Project < ActiveRecord::Base
has_many :memberships
has_many :users, through: :memberships
end
rake routes
表示成员资格路径存在,但以下尝试给出了答案:
我尝试使用指向帮助者的链接来删除成员资格:
<%= link_to "delete", membership, method: :delete %>
EDIT: error: undefined local variable or method `membership'
<%= link_to "delete", @membership, method: :delete %>
EDIT: error: Sorry something went wrong --> goes to /memberships
<%= link_to "delete, membership_path(@membership), method: :delete %>
EDIT: error No route matches {:action=>"destroy", :controller=>"memberships", :id=>nil} missing required keys: [:id]
如何确保成员身份与@project.membership\u id
中的关联id一起删除?我应该包括某些额外参数吗?您的代码不起作用的原因是您没有指定链接到
的路径。我不相信你需要有@会员资格
,所以我把它删掉了
<%= link_to "delete", membership_path(@membership), method: :delete %>
资源:成员身份,仅限:[:创建,:销毁]
使现代化
不知道我之前怎么会错过这个,在你的销毁操作中,你拥有成员资格。find(:id)。destroy
。它应该使用params,并且更符合以下原则:
# MembershipsController
def destroy
@membership = Membership.find(params[:id])
if @membership.destroy
redirect_to current_project || request.referer
else
#
end
end
您的ProjectsController
的显示操作没有将@membership
定义为成员身份
对象
def show
@user = current_user
@project = @user.projects.find(params[:id])
@membership = Membership.find_by user: @user, project: @project
# build is used for nested attributes, not sure why you'd have this in a show action...
# @project.memberships.build if logged_in?
# the following are redundant.
@projects = @user.projects
@members = @project.users
@memberships = @project.memberships
end
在视图中:
如果希望在删除父项后销毁项目或用户的所有成员资格,请对用户
&项目
模型进行以下更改:
class Project < ActiveRecord::Base
has_many :memberships, dependent: :destroy
has_many :users, through: :memberships
end
class User < ActiveRecord::Base
has_many :memberships, dependent: :destroy
has_many :projects, through: :memberships
end
class项目
它们会产生什么样的错误?生成链接或单击链接时是否会发生错误?是否可以将显示“删除”链接的控制器操作的代码发布到成员身份?我认为问题在于呈现该视图,而不是MembershipController
类上的destroy
方法。到目前为止,当我点击链接时会出现错误,这取决于成员路径的代码。不要简单地抛出代码,而是解释为什么应该使用它。扔代码就像给别人一条鱼。解释它就是教他们如何捕鱼。这很公平。代码不起作用的原因是您没有指定链接到的路径。我不认为你需要@membership,所以我编辑了它。membership\u path
需要一个对象传递给它,否则Rails将不知道删除什么。也许我应该为你澄清一下。正确的语法是membership\u路径(@membership)
。这不是link\u to
方法中的另一个参数。你说得对。。。现在对我来说,这是一个清晨,一个从裂缝中溜走了!错误包括在上面。路线正是您建议的路线。:)它的渲染效果很好,但当单击它时,它将路由到/memberships。没有索引,所以它会给出一个“很抱歉,出了点问题”错误。谢谢@kjmagic13。它仍然出现“找不到没有ID的项目”错误。但这可能是因为在路由器文件中,我没有将成员身份嵌套到项目中,而是将它们视为单独的资源。。这可能是个问题吗?我发现并解决了我的问题,主要是因为你的回答!所以谢谢:)问题是我必须在delete请求中传递参数,否则它就无法识别在删除之后它必须去哪里。我使用方法::delete为实现了一个表单。
<%= link_to "delete", membership_path(@membership), method: :delete %>
# MembershipsController
def destroy
@membership = Membership.find(params[:id])
if @membership.destroy
redirect_to current_project || request.referer
else
#
end
end
def show
@user = current_user
@project = @user.projects.find(params[:id])
@membership = Membership.find_by user: @user, project: @project
# build is used for nested attributes, not sure why you'd have this in a show action...
# @project.memberships.build if logged_in?
# the following are redundant.
@projects = @user.projects
@members = @project.users
@memberships = @project.memberships
end
class Project < ActiveRecord::Base
has_many :memberships, dependent: :destroy
has_many :users, through: :memberships
end
class User < ActiveRecord::Base
has_many :memberships, dependent: :destroy
has_many :projects, through: :memberships
end