我正在我的网页上设置一个简单的调查。 我想添加一个before_filter,以便同一个人不能多次参加调查。
我的想法是
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
答案 0 :(得分:1)
unless Survey.find_by_remember_token(cookies[:remember_token]).nil?
这意味着如果Survey不是nil然后重定向,我认为你需要改为
unless Survey.find_by_remember_token(cookies[:remember_token])
或
if Survey.find_by_remember_token(cookies[:remember_token]).nil?
答案 1 :(得分:1)
我认为在将cookie[:remember_token]
用作find_by_remember_token()
的参数之前,您需要测试cookies[:remember_token]
的存在性。仅当if cookies[:remember_token] && Survey.find_by_remember_token(cookies[:remember_token])
redirect_to thanks_page
end
不是nil并且找到记录时才会重定向到thanks_page。
{{1}}