Rails路由将自定义destroy方法与用户控制器

时间:2017-07-02 15:22:43

标签: ruby-on-rails

我有一个用户控制器,它有以下两种销毁方法: -

  def destroy
    @user = User.find_by(params[:id])
    @user.destroy
    flash[:success] = "Account successfully closed"
    redirect_to root_path
  end

  def destroy_avatar
    @user = User.find_by(params[:id])
    @user.remove_avatar!
    @user.save
    render 'edit'
  end

第一种是删除用户的默认destroy方法。第二个是我定义的用户可以从用户编辑页面中删除他们的头像。

我在routes.rb中定义了以下内容以使destroy_avatar正常工作: -

delete '/users/:id', to: 'users#destroy_avatar', as: 'destroy_avatar'
resources :users

但不幸的是,当我实施此功能时,我在用户编辑页面上的关闭帐户按钮已恢复为destroy_avatar操作。

这是对视图中两个操作的调用: -

.
.
.
        <% if current_user.avatar_url %>
          <%= link_to "Delete avatar", destroy_avatar_path,
              method: :delete,
              data: {:confirm => 'Are you sure?'},
              class: 'btn btn-xs btn-danger',
               "data-toggle" => "tooltip",
               "data-placement" => "right",
               "title" => "Delete avatar" %>
.
.
.
      <%= link_to "Close account", user_path(@user),
                                   method: :delete,
                                   data: {:confirm => "Are you sure?"},
                                   class: "btn btn-xs btn-danger"%>
.
.
.

我去看看是否有办法让destroy_avatar在不使用路线的情况下工作,但是我找到了一个way用AJAX来做,而不需要额外的路线,这实际上会更方便但是我不知道Javascript,也无法根据我的情况自定义代码。

我还在学铁路,我不知道我不知道的是什么!所以我想知道我有什么选择。

有没有办法在不使用两条路线的情况下这样做?如果不是,我应该如何为destroy_avatar定制路由,以便与用户销毁操作的路由没有冲突?

1 个答案:

答案 0 :(得分:0)

好的,我明白了。

将路线更改为

delete '/users/:id/destroy_avatar', to: 'users#destroy_avatar', as: 'destroy_avatar'

并从视图中看:

<%= link_to "Delete avatar", "/users/#{@user.id}/destroy_avatar" %>