簡體   English   中英

Rails / Devise:優雅地要求用戶登錄已注銷的創建

[英]Rails / Devise: Gracefully ask user to sign in on signed-out create

我將繼續調整Rails入門項目,以獲取所需的身份驗證行為。

我想在特定操作級別而不是整個控制器上控制允許和不允許的操作。 例如,您無需登錄即可查看帖子( index / show ),但是您必須登錄才能訪問表單以提交新帖子( new )並處理已提交的帖子( create )。

由於我希望人們在未登錄的情況下被重定向到登錄,並且我將在一百萬個位置中一遍又一遍地使用該代碼段,因此將其放在應用程序控制器中:

def authcheck
    unless user_signed_in?
        redirect_to new_user_session_path
    end
end

對於新帖子,這似乎可行:

def new
    authcheck #see application controller
    @post = Post.new
end

但是對於我有兩個選項卡打開並且在新帖子表格上有第一個選項卡的情況,但是我注銷了第二個選項卡,然后嘗試在第一個表格上提交帖子,我得到一個關於用戶身份的錯誤即使在我看來應該將其重定向為null:

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_from_forgery with: :exception exception更改為null_session protect_from_forgery with: :exception行。

基本上:為什么它不像顯示新帖子的表單那樣重定向到登錄頁面? 而且,從那里開始,您可能會建議我應該怎么做?

我想我在錯誤的印象下工作。 我以為redirect_to是執行的結束。 但這似乎不起作用-例如,在重定向行之后,我可以綁住服務器以試圖使圓圈平方 ,即使它與吐出網頁無關。

我修改了“ authcheck”以返回true或false,然后將所有內容放入if塊中。 第一個示例並沒有使舊方法失敗,因為它只是實例化一個新帖子,但實際上是否保存無關緊要。

更改為應用程序控制器例程:

def authcheck
    unless user_signed_in?
        redirect_to new_user_session_path
        return false
    end
    return true
end

對Posts控制器例程的更改:

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

我懷疑我不是按照接受的方式來做事,所以我會堅持幾天才能接受自己的答案。 :-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM