0

在此先感謝您的幫助!我有一個以Ruby on Rails(2.3.15,1.8.7)爲基礎的網站,可以讓人們在不同的地點創建路線,並在每個地點開展不同的活動。該網站有一種方法可確保當前用戶只能刪除與其帳戶相關的行程。在itineraries_controller.rb中執行此操作的代碼如下所示:限制訪問Ruby on Rails應用程序中的「銷燬」功能

def destroy 
    @itinerary = Itinerary.find(params[:id]) 
    if @itinerary.user_id == current_user.id 

    @itinerary.destroy 

    respond_to do |format| 
     format.html { redirect_to('/home') } 
     format.xml { head :ok } 
    end 
    else 
    redirect_to '/' 
    end 
end 

此係統運行正常。然而,我想爲活動做同樣的事情。在activities_controller中,我想確保當前用戶只能刪除與他的賬戶相關的活動。

目前,這裏有我的四個型號(帶不必要的東西去掉了):

User.rb

class User < ActiveRecord::Base 
    has_many :itineraries 
end 

Itinerary.rb

class Itinerary < ActiveRecord::Base 
    has_many :locations 
    belongs_to :user 
end 

Location.rb

class Location < ActiveRecord::Base 
    belongs_to :itinerary 
    has_many :activities 
end 

Activ ity.rb

class Activity < ActiveRecord::Base 
    belongs_to :location 
end 

這裏是我從activities_controller.rb開始的地方。僅供參考,我的current_user.id由authenticated_system.rb創建,所以不要擔心那部分。

def destroy 
    @activity = Activity.find(params[:id]) 
    if @itinerary.user_id == current_user.id 

    @activity.destroy 

    respond_to do |format| 
     format.html { redirect_to("/") } 
     format.xml { head :ok } 
    end 
    else 
    redirect_to '/' 
    end 
end 

我試圖使用的has_many模型連接:通過方法,但我不知道該怎麼做了三個多模式,我不知道這是正確的做法呢。再次感謝您提供的任何幫助!

回答

2

你可以簡單地做

if @activity.location.itinerary.user_id == current_user.id 
+0

解決了!謝謝,伊斯梅爾。你能告訴我這種將不同模型串起來的方法嗎?我是一個noob,但我想了解更多(並會根據你的迴應谷歌找到一些好的資源。) – KDP 2013-03-01 18:20:18

+0

你可以做這坦克到你與belongs_to和has_many設置的關係,它們將這些方法設置爲您。你可以找到關於它的信息吃了指南 – 2013-03-01 22:53:24

0

你真的只需要詢問活動的位置,然後問位置的行程,多問它的用戶。這有點違反了德米特法,但它會起作用。

loc = @activity.location 
itin = loc.itinerary 
if itin.user_id = current_user.id 
... 

這應該工作。

+0

奧斯汀,我非常感謝你的迴應。我只是因爲這是一個更簡單的方法而與其他答案一起去了,但是感謝你的時間。 – KDP 2013-03-01 18:21:08