3

我正在尝试向我的模型添加删除功能。这是我想出的,但即使我不需要渲染页面来删除某些东西,Rails 也会渲染并且找不到“delete.html.erb”的文件

我正在使用 Ruby 2.0dev 和 Rails 4.0

我的删除链接:

<%= link_to "Delete", reservation_delete_path(item), :class => "btn btn-small btn-danger", method: :delete, data: {confirm: 'Are you sure?'} %></td>

我的路线文件:

match 'reservations/delete/:id' => 'reservations#delete', via: :delete, :as => 'reservation_delete'

我的控制器:

def delete
  @current = Reservations.find(params[:id])
  if current_user
    if @current.user_id == current_user.id
      @current.destroy!
      redirect_to reservations_path
    else
      redirect_to reservations_path
    end
  else
    redirect_to reservations_path
  end
end
4

5 回答 5

3

无需为每个条件重复重定向 3 次。您可以简化删除方法:

def delete
  @current = Reservations.find(params[:id])

  if current_user && @current.user_id == current_user.id
    @current.destroy!
  end

  redirect_to reservations_path
end

在您的问题中,如果current_user不可用,则您没有重定向,因此正在运行隐式渲染。

于 2013-10-24T01:45:55.957 回答
1

您的设置不是惯用的,并且您没有包含代码,因此任何事情都可能出错。例如,这不能是您的整个路线文件;没有指定索引/显示/编辑/删除按钮所在的任何页面。另一个例子:你的动作被命名delete而不是destroy. 无论如何,我可以向您展示一个有效且更规范的示例:

模型/reservation.rb:

class Reservation < ActiveRecord::Base
end

控制器/reservations_controller.rb:

class ReservationsController < ApplicationController
  def index
    @reservations = Reservation.all
  end

  def destroy
    @reservation = Reservation.find(params[:id])
    @reservation.destroy

    redirect_to reservations_url
  end
end

意见/保留/index.html.erb:

<% @reservations.each do |reservation| %>
  <%= link_to 'Destroy', reservation, method: :delete, data: { confirm: 'Are you sure?' } %>
<% end %>

(这实际上只会显示删除相应预订的链接......<%= reservation.name %>如果你想查看更多信息,你必须坚持或任何东西)

配置/路由.rb:

Howdy::Application.routes.draw do
  resources :reservations, only: [:index, :destroy]
  root 'reservations#index'
end

(我的应用名称是你好)

您正在进行一些用户身份验证,因此请相应地添加。如果您是从一个控制器继承的,该控制器在执行操作之前执行特殊的用户身份验证操作,这可能就是它尝试渲染的原因delete.html.erb

于 2013-10-24T01:57:47.967 回答
-1

看起来您缺少这些重定向的返回,这实际上导致 Rails 执行重定向尝试呈现视图。

return redirect_to reservations_path
于 2013-10-21T18:35:01.090 回答
-1

两件事情:

当您在路由文件中指定删除(销毁)操作时,它是资源的一部分。要以“rails”方式执行此操作,您可能会考虑让您的路线文件看起来更像:

resources: :reservations, only: [:delete]

...然后让删除链接更像:

<%= link_to 'Delete', delete_reservation_path(item), :class => 'btn btn-small btn-danger', method: :delete, data: {confirm: 'Are you sure?'} %>

...然后在您的控制器中,您可以:

def destroy
  @current = Reservations.find(params[:id])
  if current_user
    if @current.user_id == current_user.id
      @current.destroy!
      redirect_to reservations_path
    else
      redirect_to reservations_path
    end
  else
    redirect_to reservations_path
  end
end

...或者您实际上可以为删除操作创建一个 rjs 模板来执行一些花哨的 javascript 工作,或者您可以简单地为索引操作呈现视图(更快地加载重定向)。

于 2013-10-21T19:54:34.037 回答
-2

当您开始设置 && 门时,我的建议是检查是否有现有的解决方案。在这种情况下,您可能正在寻找 CanCan gem 中可用的功能。

可以可以

基本上,您在控制器操作之前加载_和_授权您的用户,并通过能力模型检查他们。您还可以获得视图助手,例如

if can? :destroy, reservation 
  ... do awesome stuff here ...

从长远来看,这将是一个更好的解决方案。

于 2013-10-29T20:31:46.000 回答