2014-07-22 31 views
0

我正在研究一個應用程序,其中用戶可以列出他們的遊戲內物品以與其他用戶交易。用戶的個人資料網址將是這樣的:Ruby on Rails:有問題根據上下文選擇正確的參數方法使用的方法

/用戶/ 1 /指數

而且他們的用戶列表配置文件會像

/用戶/ 1 /人數/ 1

所有嵌套在用戶下的其他資源將與後者相同。

我試圖實現一個由before_filter回調調用的方法,該方法檢查用戶是否阻止或被擁有該配置文件的用戶阻止或者被相應的嵌套資源阻止,例如發送消息的能力,查看他們列表等。如果其中任何一個互相阻塞,那麼他們重定向到應用程序的根頁面。這是我使用的的before_filter方法:

def blocked_relationships 
    if blocked? 
    redirect_to :root 
    end 
end 

我用的是檢查兩個用戶之間的關係的狀態的另一種方法。 這是我發現後Rails的食譜書的一些研究禮貌製作的方法:

def blocked? 
    Relationship.exists?(user_id: current_user.id, other_user_id: params[:user_id], status: "blocked") || 
    Relationship.exists?(user_id: params[:user_id], other_user_id: current_user.id, status: "blocked") 
end 

我的問題是,這種方法僅適用,例如,當用戶1是看用戶2的項目,消息列表等因爲URL:

/用戶/ 2 /目錄[或項目或等]

將包含一個PARAMS使得參考給用戶作爲PARAMS [:USER_ID]。在這種情況下,params [:id]和上下文將引用列表id。

但是,如果我是用戶1,並且我阻止了用戶2並訪問用戶2的配置文件,則此方法將不起作用,因爲url/users/2/index將使用params [:id]來代替params [:用戶名]。

我一直在思考如何實現這在乾燥的方式,但我似乎無法來解決不是做這樣的事情等我的問題:

def blocked? 
    if params[:user_id].blank? 
    Relationship.exists?(user_id: current_user.id, other_user_id: params[:id], status: "blocked") || 
    Relationship.exists?(user_id: params[:id], other_user_id: current_user.id, status: "blocked") 
    else 
    Relationship.exists?(user_id: current_user.id, other_user_id: params[:user_id], status: "blocked") || 
    Relationship.exists?(user_id: params[:user_id], other_user_id: current_user.id, status: "blocked") 
    end 
end 

我也認爲我」的可能性米甚至沒有正確實施我的阻止功能,但在我解決這個問題之前,我想知道是否有人對如何解決這個問題有任何想法。任何幫助或反饋將不勝感激,我很樂意爲澄清添加任何信息。謝謝!

回答

0

爲什麼不是other_id = params[:user_id] || params[:id]?當存在:user_id時,這是一種覆蓋:id的方法。

關於你的阻塞功能,儘管如此,我想看到一個用戶,即使我已經阻止他們。我會在關係上創建一個blocked_by_user_id字段,以查看誰執行了阻止操作並僅禁止被阻止的用戶查看用戶的個人資料。

0

您可能想要簽出像cancan或相關(這不是我最喜歡但最受歡迎的)軌道的授權寶石。但是,你可以處理這樣的:

class User 
    has_many :relationships, 
    scope :accessible_by, 
    ->(user) { where.not id: user.relationships.where(status: :blocked).pluck(:other_user_id) } 
end 

然後使用關係User.accessible_by(current_user)控制器上,而不是明明白白User檢索資源。例如:當用戶試圖訪問無法查看,ActiveRecord::RecordNotFound將提高資源

class Users::PicturesController < UsersController 
    def index 
    @pictures = User.accessible_by(current_user) 
     .find(params[:user_id]).pictures 
    end 

    def show 
    @picture = User.accessible_by(current_user) 
     .find(params[:user_id]).pictures.find(params[:id]) 
    end 
end 

,所以:

class UsersController < ApplicationController 
    def index 
    @users = User.accessible_by(current_user) 
    # bleh 
    end 

    def show 
    @user = User.accessible_by(current_user).find(params[:id]) 
    # etc 
    end 
end 

當資源被用戶下築巢,你可以這樣做你應該處理它:

class ApplicationController < ActionController::Base 
    rescue_from ActiveRecord::RecordNorFound, with: :rescue_not_found 

    private 

    def rescue_not_found 
    redirect_to root_path, 
     notice: 'You can\'t access that with your current priveleges. ' 
    end 
end