Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails/Deviate:优雅地要求用户在注销时登录创建_Ruby On Rails_Authentication_Devise - Fatal编程技术网

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
我怀疑我并没有按照公认的方式做事,所以在接受我自己的答案之前,我会坚持几天。:-)