2013-04-04 44 views
0

我正在我的網頁上設置一個簡單的調查。 我想添加一個before_filter,以便同一個人不能多次參與調查。如何爲我們在第一次過濾之前過濾器中的永久cookie過濾器

我的想法是

1)創建和提交時一個remember_token保存每個調查。

2)創建一個基於記得令牌的cookie被放置在提交的瀏覽器

3)每次有訪問的頁面,使用過濾器之前,以確保他們沒有一個匹配的cookie數據庫中的一項調查。

我放在一起下面,但​​由於某種原因,它會自動重定向到thanks_path,無論我是否有記憶令牌?

它爲什麼這樣做?我是否錯誤地使用會話cookie?

surveys_controller是如下

before_filter :new_visitor, only: [:new, :create] 

def new 
    #this is the survey form 
    @survey = Survey.new 
end 

def create 
    #this submits the survey and creates a cookie on the client's browser 
    @survey = Survey.new(params[:survey]) 
    if @survey.save 
    cookies.permanent[:remember_token] = @survey.remember_token 
    redirect_to thanks_path 
    else 
    render action: "new" 
    end 
end 

def thanks 
    #blank page that just says, "thanks for taking the survey!" 
end 

def new_visitor 
    # if a browser has a survey cookie, redirect to thanks page 
    unless Survey.find_by_remember_token(cookies[:remember_token]).nil? 
    redirect_to thanks_path 
    end  
end 

我創造我Survey模型記得令牌。

class Survey < ActiveRecord::Base 
    before_save :create_remember_token 

    def create_remember_token 
    self.remember_token = SecureRandom.urlsafe_base64 
    end 
end 

回答

1

我認爲你需要測試存在之前使用它作爲find_by_remember_token()的參數之前的cookie[:remember_token]。只有在cookies[:remember_token]不是零並找到記錄時,您纔會重定向到thanks_page。

if cookies[:remember_token] && Survey.find_by_remember_token(cookies[:remember_token]) 
    redirect_to thanks_page 
end 
+0

是的,好像是這個問題,謝謝! – umezo 2013-04-04 23:09:26

1
unless Survey.find_by_remember_token(cookies[:remember_token]).nil? 

這意味着,如果調查不爲零然後重定向,我認爲你需要改變

unless Survey.find_by_remember_token(cookies[:remember_token]) 

if Survey.find_by_remember_token(cookies[:remember_token]).nil? 
+0

謝謝@Konstantin。我想要做的是重定向',除非訪問者對該網站是新的。所以我使用'Survey.find_by_remember_token(cookies [:remember_token])。nil?'表示'新到site.'否則,你認爲我的邏輯有意義嗎? – umezo 2013-04-04 21:27:20

+1

如果cookies [:remember_token]爲零,會發生什麼情況?你用一個無參數調用find_by。什麼返回? – Fred 2013-04-04 21:39:28

+0

謝謝弗雷德。這個問題似乎就像我說的那樣,我在find_by參數上調用nil。 – umezo 2013-04-04 23:13:00

相關問題