0

我正在我的网页上设置一个简单的调查。我想添加一个 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
4

2 回答 2

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?
于 2013-04-04T21:26:09.420 回答
1

我认为您需要cookie[:remember_token]在将其用作find_by_remember_token(). 仅当cookies[:remember_token]不是 nil 并且找到记录时,您才会重定向到Thanks_page。

if cookies[:remember_token] && Survey.find_by_remember_token(cookies[:remember_token])
    redirect_to thanks_page
end
于 2013-04-04T21:51:55.900 回答