簡體   English   中英

Rails DELETE http方法呈現頁面

[英]Rails DELETE http method renders page

我正在嘗試向我的模型添加刪除功能。 這就是我想出來的,但即使我不需要渲染頁面來刪除某些內容,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

對於每個條件,無需復制重定向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不可用,則您沒有重定向,因此正在運行隱式渲染。

你的設置不是慣用的,而且你沒有包含的代碼,所以任何事情都可能出錯。 例如,那不能是你的整個路線文件; 沒有指定索引/顯示/編輯/刪除按鈕所在的任何頁面。 另一個例子:你的行動被命名為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 %>或其他任何內容)

配置/ routes.rb文件:

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

(我的應用名稱是你的)

您正在進行一些用戶身份驗證,因此請相應添加。 如果您在執行操作之前從一個執行特殊用戶身份驗證的控制器繼承,這可能就是為什么它試圖渲染delete.html.erb

看起來你錯過了那些重定向的返回,這實際上導致Rails執行重定向嘗試渲染視圖。

return redirect_to reservations_path

兩件事情:

在routes文件中指定delete(destroy)操作是資源的一部分。 要以“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工作,或者您可以簡單地渲染索引操作的視圖(更快地加載重定向)。

當你開始提出&& gate時我的建議是檢查是否有現有的解決方案。 在這種情況下,您可能正在尋找CanCan gem中可用的功能。

可以可以

基本上你在控制器操作之前對用戶進行load_and_authorize ,並通過Ability模型檢查它們。 您也可以獲得視圖助手

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

從長遠來看,這將是一個更好的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM