2011-04-18 93 views
0

我有這個呼叫我的投票模式:嘗試使用CURRENT_USER它是未定義

fires :vote_updated, :on => :update, 
        :actor => :user, 
        :secondary_subject => :video, 
        :if => lambda { |vote| ((vote.value == 1) || (vote.value == -1)) && (vote.video.user != current_user)} 

如果你不熟悉,它的工作原理與timeline_fu plugin

如果擁有投票視頻的用戶是當前用戶,我不希望該電話被解僱。這就是這條線進來:

:if => lambda { |vote| ((vote.value == 1) || (vote.value == -1)) && (vote.video.user != current_user)} 

不過,我沒有current_user這裏訪問。我如何解決這個問題?

下面是我的票控制器創建方法(實際上有沒有更新的方法):

def create  
    @video = Video.find(params[:video_id]) 
    @vote = current_user.video_votes.find_or_create_by_video_id(@video.id) 

    if @vote.value.nil? 
    if params[:type] == "up" 
     @vote.value = 1 
    else 
     @vote.value = -1 
    end 
    elsif (params[:type] == "up" && @vote.value == 1) || (params[:type] == "down" && @vote.value == -1) 
    @vote.value = 0 
    elsif ((params[:type] == "up" && @vote.value == -1) || (params[:type] == "down" && @vote.value == 1)) || (@vote.value == 0) 
    if params[:type] == "up" 
     @vote.value = 1 
    else 
     @vote.value = -1 
    end 
    end 

    if @vote.save 
    respond_to do |format| 
     format.html { redirect_to @video } 
     format.js 
    end 
    else 
    respond_to do |format| 
     format.html 
     format.js 
    end 
    end 
end 

回答

0

我相信這樣做的控制器將確認這是正確的。我將過濾器之前創建一個針對這種情況

UPDATE:

就像一個簡單的例子:

before_filter :valid_vote, :only => :update 

def update 
    @vote.update_attributes(params[:vote]) # or whatever 
end 
.. 

private 

def valid_vote 
    @vote = Vote.find params[:id] 
    unless (@vote.video.user.id != current_user.id) 
     render :text => 'You can't vote for your own video', :status => 403 
    end 
end 

所以@vote在聲明並處理連線您的「更新」行動之前驗證。 如果它不是有效的,那麼你的「更新」行動保持不變

更新2:

不知道你會喜歡它,但你也可以做如下:

在投票模型

attr_accessor :skip_timeline 

然後用與之前過濾器的概念,但做@vote.skip_timeline = true,而不是渲染文本

則聲明可能如下:

:if => lambda { |vote| ((vote.value == 1) || (vote.value == -1)) && !vote.skip_timeline } 

你也可以移動((vote.value == 1) || (vote.value == -1))您之前過濾:

def valid_vote 
    @vote = Vote.find params[:id] 
    unless ([1,-1].include? @vote.value && @vote.video.user.id != current_user.id) 
     @vote.skip_timeline = true 
    end 
end 

:如果=>拉姆達{|投票| !vote.skip_timeline}

+0

哪個控制器?這是什麼樣子? – 2011-04-18 05:14:12

+0

哦,我明白你在做什麼......我問的是不同的。這並不是說用戶不能在自己的視頻上投票,而是不管是誰投票視頻,如果他/她是視頻的所有者,則不會爲current_user創建timeline_event對象。 – 2011-04-18 05:31:31

+0

正確的,增加第二次更新 – 2011-04-18 06:30:13

0

您會收到此錯誤消息,因爲通常不建議您訪問模型中的current_user(或會話信息)。我不是那麼熟悉timeline_fu寶石,所以這個答案不會是你可能得到的最好答案。我只是要告訴你如何從任何模型訪問current_user。

首先轉到您的應用程序控制器。你會想製作一個設置當前用戶的方法。您需要在之前的過濾器中調用該方法。

before_filter :loadCurrentUser 

def loadCurrentUser 
  User.currentUser = current_user 
end 

然後在您的用戶模型中,您需要定義'currentUser'。

def self.currentUser 
    Thread.currentUser[:user] 
end 

你不一定要聲明在應用程序控制器的CURRENT_USER,但因爲它是一塊寶石,我不知道,如果它有一個方便的控制器。

編輯:這種方式可能容易出現問題,但我不完全確定您是否在問如何使current_user在模型中可用或完全不同的解決方法,以便您沒有該問題......並閱讀另一個答案的回答,我想這不是你問的。

+0

這似乎是一個很好的解決方案,但它可能會導致一些問題,如果線程被容器重複使用 – 2011-04-18 08:16:44

+0

是的,這似乎是一個很好的解決方案..我只是害怕,這可能會導致我的應用程序中無法預料的問題...我想想我可能會嘗試一下 – 2011-04-18 16:54:24

相關問題