如何使一条路线只允许使用一次
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
注册后我将用户重定向到他们可以选择的路线,如果他们想为他们的帐户添加照片,但我希望这条路线只有在他们注册后才能访问,所以他们可以添加稍后在 "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