2013-10-21 38 views
3

我想向我的模型添加刪除功能。這是我想出的,但即使我不需要渲染頁面來刪除的東西,Rails渲染和找不到文件的「delete.html.erb」我正在使用的文件爲Rails刪除http方法呈現頁面

紅寶石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 
+0

您是否有其他可能會干擾的路線?也許你已在'match'reservations/delete /:id'=>'reservations#delete'之前加入'resources:reservations',通過:: delete,:as =>'reservation_delete''?否則,嘗試訪問'localhost:3000/rails/routes',並在那裏定義你的路由。如果您向我們展示了您的整個路線文件,它可能會有幫助 – jokklan

+1

你也可以改善你的控制器(請參閱@Damien Roche的答案)和你的路線。你不應該使用匹配,不建議在Rails 4中使用,而是使用'delete'reservations/delete /:id'來:'reservations#delete',如:'reservation_delete''或更好的資源:reservartions ,只有::刪除'作爲musicnerd47的建議。 – jokklan

回答

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不可用,你有沒有重定向,所以隱式的渲染是正在運行。

-1

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

return redirect_to reservations_path 
+0

添加「返回」不會改變結果。 – Yagiz

+0

不,你不需要返回聲明,根本不需要! – jokklan

-1

兩件事情:

刪除(銷燬)行動是對資源的一部分,當你在路由文件中指定。要做到這一點,「鐵軌」的方式,你可能會考慮讓你的路由文件看起來更像:

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的工作,或者你可以簡單地渲染索引操作的視圖(LO快廣告重定向)。

+0

您的路線語法實際上是錯誤的。它應該是資源::保留,:僅=> [:刪除]也,「並返回」不會改變結果。 – Yagiz

+0

你不需要'並返回'。 – jokklan

+0

但是是@Yagiz,如果你在ruby 2中使用Rails 4,那麼正確的語法是'resources :::reservations,只有:[:delete]'。在ruby 2.0.0之後,推薦使用新的hash syntaz('key:「value」')而不是舊的(':key =>「value」')。 – jokklan

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 

的意見/預訂/指數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

+0

正如你所建議的@Kaleidoscope,正確的'via::delete'而不是'method :: delete',就是這個問題。但是非常好的建議,會改善很多代碼中的問題:) – jokklan

-2

我的建議,當你開始搭建& &門被檢查,看是否有一個現有的解決方案。在這種情況下,您可能正在尋找CanCan gem中可用的功能。

CanCan

基本上你load_and_authorize用戶控制器動作之前,檢查它們通過能力模型。您還可以獲得視圖助手,如

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

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

+0

這不是對原始問題的解決方案。 – Josh