我正在尝试设置允许用户仅在某些情况下访问某些网址的内容。现在我有一个setEvent/:id
网址,可以将用户的属性设置为event_id
,然后将用户重定向到event
网址。用户可以访问.../whatever/event/1
之类的网址,其中1
需要等于event_id
,如果不是,则会重定向用户。
但是,这并不能阻止某人只需在地址栏中输入.../whatever/setEvent/:id
即可访问该页面。
答案 0 :(得分:1)
执行此操作的正确方法是在控制器中执行before操作。以下是我的某个应用程序中的示例,其中未登录的用户将始终重定向到new_session URL。
class ApplicationController < ActionController::Base
helper_method :current_user, :logged_in?, :herd_user
def herd_user
redirect_to new_session_url unless logged_in?
end
... other medthods...
end
和
class StaticPagesController < ApplicationController
before_action :herd_user
def index
end
end
答案 1 :(得分:0)
如果没有引入更多宝石,你可以做一个before_action
before_action :enforce_tenancy, except: [:index]
before_action :allow_only_admin, only: [:index]
private
def enforce_tenancy
render unauthorized unless event.user_id == current_user.id
end
def allow_only_admin
render no_way_sucka_path unless current_user.admin?
end
答案 2 :(得分:0)
我有类似的问题,这可能不是处理它的最佳方式,但在该页面的操作中,您可以检查当前网址并检查属性,然后重定向到他们可以访问的属性,如果它们不正确网址。
有点像:
url_id = request.fullpath.sub('/whatever/event/', '')
redirect_to user_page_path(user.id) unless (current_user.event_id.to_s == url_id)
很抱歉,如果代码不是很好,我会尝试根据您提供的信息编写代码。
编辑*确保在从数据库获取页面的任何信息之前执行此操作,否则效率会降低。