Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 销毁一个has\u many:through不使用链接\u到帮助程序_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 销毁一个has\u many:through不使用链接\u到帮助程序

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表示成员资格路径存在,但以下尝试给出了答案: 我尝试使用指向帮助

我正在Rails 4中开发一个简单的项目管理工具,让我头疼的部分有三个主要模型:
项目
用户
成员身份

用户可以有很多项目,项目可以有很多用户。我通过以下方式实现了项目和用户之间的
成员关系:

项目:

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