如何使一条路线只允许使用一次

How to make a route being allowed for use only one time

注册后我将用户重定向到他们可以选择的路线,如果他们想为他们的帐户添加照片,但我希望这条路线只有在他们注册后才能访问,所以他们可以添加稍后在 "Edit Account" 中的一张照片,但我希望这条路线不被允许,即使他们在 /users/chosephoto 之后键入它也是如此。但它不起作用,因为该路线仍然允许

所以我希望这条路线只能访问一次(在他们注册后)所以以后即使他们登录并尝试输入 /users/chosephoto 我希望他们被重定向到 root_path

控制器

before_action :visited_chosephoto, only: [:add_photo]
...


def chose_photo
   @user = current_user
end

def add_photo
   @user = current_user
   @user.update_attribute(:photo,params[:user][:photo])
   @user.chosephoto_visited = true
   @user.save
   redirect_to root_path
end

用户模型

def chosephoto_visited=(chosephoto_visited)
   @chosephoto_visited = chosephoto_visited
end

def chosephoto_visited
   @chosephoto_visited
end

方法

def visited_chosephoto
   redirect_to root_path if current_user.chosephoto_visited
end

路线

 get 'users/chosephoto' => "users#chose_photo", as: "chosephoto"
before_action :visited_chosephoto, only: [:add_photo, :chose_photo]

为过滤器添加第二个选项 运行 该方法也适用于 chose_photo 操作

您需要在控制器中定义:

def can_access_choose_photo?
  return false unless current_user.present?
  # return true  if request.get?
  return false if current_user.chosephoto_visited
  return true
end

def choose_photo
  if can_access_choose_photo?
    current_user.update_attributes(chosephoto_visited: true)
    # other actions
  else
    redirect_to root_url
  end
end

注1这里不需要before_action。检查仅用于单个操作。

注 2 您还应该将 chosephoto_visited 列添加到您的 User 模型中。否则,它将无法按预期工作。

如果该页面的 HTTP 引荐来源网址是用户注册,您可以在过滤器之前签入,如果是,您允许用户访问 chosephoto 页面,否则您可以将用户重定向到 root url.

if !URI(request.referer).path == '/signup' || !URI(request.referer).path == nil
  redirect_to root_path
end