Ruby on rails Rails/Deviate:优雅地要求用户在注销时登录创建
我将继续调整项目以获得我想要的身份验证行为 我想在特定操作的级别上控制什么是允许的,什么是不允许的,而不是整个控制器。例如,您无需登录即可查看帖子(Ruby on rails Rails/Deviate:优雅地要求用户在注销时登录创建,ruby-on-rails,authentication,devise,Ruby On Rails,Authentication,Devise,我将继续调整项目以获得我想要的身份验证行为 我想在特定操作的级别上控制什么是允许的,什么是不允许的,而不是整个控制器。例如,您无需登录即可查看帖子(索引/显示),但您必须登录才能访问表单以提交新帖子(新建)并对提交的帖子进行处理(创建) 由于我希望人们在未登录时被重定向到登录,并且我将在一百万个地方反复使用该代码段,因此我将其放入应用程序控制器: def authcheck unless user_signed_in? redirect_to new_user_sessi
索引
/显示
),但您必须登录才能访问表单以提交新帖子(新建
)并对提交的帖子进行处理(创建
)
由于我希望人们在未登录时被重定向到登录,并且我将在一百万个地方反复使用该代码段,因此我将其放入应用程序控制器:
def authcheck
unless user_signed_in?
redirect_to new_user_session_path
end
end
对于新职位,这似乎是可行的:
def new
authcheck #see application controller
@post = Post.new
end
但是,如果我打开了两个选项卡,并且在新的帖子表单上有第一个选项卡,但我在第二个选项卡上注销,然后尝试在第一个表单上提交帖子,我会收到一个关于用户为空的错误,即使在我看来它应该被重定向:
def create
authcheck
#when not signed in, causes error "undefined method 'posts' for nil:NilClass"
@post = current_user.posts.new(post_params)
if @post.save
redirect_to @post
else
render 'new'
end
end
实际上,我最初得到的是一个异常页面,但我在应用程序控制器的protect\u from\u forgery with::exception
行中将exception
更改为null\u session
基本上是:为什么它不重定向到登录页面,就像它只是显示一个新帖子的表单一样?从那以后,你会建议我怎么做呢?我想我是在错误的印象下工作的。我认为
重定向到就是执行的结束。但它似乎不是这样工作的——例如,在重定向线路之后,我可以连接服务器,以尝试恢复,即使这不与吐出网页有关
我修改了我的“authcheck”以返回true或false,然后将所有内容放入if块中。第一个例子并没有以旧的方式失败,因为它只是实例化了一个新帖子,但它是否真的被保存并不重要
更改为应用程序控制器例程:
def authcheck
unless user_signed_in?
redirect_to new_user_session_path
return false
end
return true
end
对POST控制器例程的更改:
def new
if authcheck #see application controller
@post = Post.new
end
end
def create
if authcheck
@post = current_user.posts.new(post_params)
if @post.save
redirect_to @post
else
render 'new'
end
end
end
我怀疑我并没有按照公认的方式做事,所以在接受我自己的答案之前,我会坚持几天。:-)