0

我无法对我的应用程序拥有的任何对象执行 DELETE 操作。

向您展示我在组控制器中的删除操作的一般代码:

def destroy
    @group = Group.find(params[:id])
    respond_to do |format|
        if @group.delete
            format.html { redirect_to group_path }
            format.json { head :no_content }
        else
            format.html { redirect_to group_path }
            format.json { head :no_content }
        end
    end
end

我的视图布局的代码:

<h1>My Groups</h1>

  <table>
    <tr>
      <th>Name</th>
      <th>Users</th>
      <th></th>
      <th></th>
    </tr>

  <% @groups.each do |group| %>
    <tr>
      <td><%= group.name %></td>
      <td>
        <% group.memberships.each do |membership| %>
          <%= User.find(membership.user_id).name %>
          <br/>
        <% end %>
      </td>
      <td><%= link_to 'Show', group %></td>
      <td><%= link_to 'Destroy', group, :confirm => 'Are you sure?', :method => :delete %></td>
    </tr>
  <% end %>
  </table>

  <br />

  <%= link_to 'New Group', new_group_path %>

即使 rails 服务器日志返回 200 OK 响应,我也无法删除组对象。返回的页面是一个空白屏幕:

Started DELETE "/groups/2" for 127.0.0.1 at 2013-03-19 01:22:01 +0800
Processing by GroupsController#destroy as HTML
  Parameters: {"authenticity_token"=>"aH+z0DlL7NeoVlxda8Td76WdnrH7/G8UyWDqbJcTu9w=", "id"=>"2"}
Completed 200 OK in 0ms (ActiveRecord: 0.0ms)

没有使用 ActiveRecord,也没有对数据库进行任何更改。过去没有这样的问题,但我最近才意识到我不能删除任何类型的对象。

我一直在尝试寻找解决在网上发现的类似问题的方法,但不幸的是,似乎还没有人遇到过这个问题。

更新1:

以下是我的应用程序布局:

<!DOCTYPE html>
<html>
    <head>
        <%= csrf_meta_tag %>
      <title>Home</title>

        <%= javascript_include_tag :application %>
        <%= stylesheet_link_tag :application, :media => "all" %>

        <%= javascript_include_tag "/javascripts/main.js" %>
        <%= stylesheet_link_tag "/css/main.css" %>
    </head>
    <body>

        <%= yield %>

    </body>
</html>

但是当我使用控制台删除对象时。有用:

1.9.3-p194 :003 > Group.find(23).delete
  Group Load (0.5ms)  SELECT "groups".* FROM "groups" WHERE "groups"."id" = $1 LIMIT 1  [["id", 23]]
  SQL (3.0ms)  DELETE FROM "groups" WHERE "groups"."id" = 23
 => #<Group id: 23, name: "groupie", created_at: "2013-03-18 15:29:42", updated_at: "2013-03-18 15:29:42", user_id: nil> 
4

2 回答 2

1

我刚刚找到了问题的解决方案。实际上,我为 around_filter 编写了一个代码,它弄乱了每个控制器的销毁会话:

  around_filter :clear_registration_id_on_destroy_session, only: :destroy


  def clear_registration_id_on_destroy_session
      is_filter_active = (controller_path == 'devise/sessions' && params[:action] == 'destroy')

      if is_filter_active && user_signed_in?
        if current_user.update_attribute(:device_platform, nil)
          logger.info "Updated device platform attributes to nil"
        end

        if current_user.update_attribute(:registration_id, nil)
          logger.info "Updated registration id attributes to nil"
        end

        yield 
      end
  end

问题是除了devise:sessions#destroy之外,我没有为任何其他控制器产生任何东西。

所以和我一样健忘的朋友们,请记得在is_filter_active不为真时考虑其他条件。

  def clear_registration_id_on_destroy_session
      is_filter_active = (controller_path == 'devise/sessions' && params[:action] == 'destroy')

      if is_filter_active && user_signed_in?
        if current_user.update_attribute(:device_platform, nil)
          logger.info "Updated device platform attributes to nil"
        end

        if current_user.update_attribute(:registration_id, nil)
          logger.info "Updated registration id attributes to nil"
        end

        yield 
      else
        yield
      end
  end
于 2013-03-19T09:48:36.663 回答
0

听起来您的删除链接只是作为show操作的链接,因为该method选项没有被选中。

您需要在应用程序布局中包含适当的 javascript,因为删除链接需要 JS 使用正确的 HTTP 方法。

如果您使用的是 Rails >= 3.1,请确保在用于呈现页面的布局文件的标题中包含以下内容:

<%= javascript_include_tag :application %>

还要确保你的布局中有 csrf_meta_tag:

<%= csrf_meta_tag %>
于 2013-03-18T17:55:33.440 回答