Rails - Flash不显示取决于我如何访问注册表单



我遵循Rails教程,我有一个问题,一直让我发疯。我想在注册后显示一个flash消息说"检查您的电子邮件",并重定向到root_url。

如果我输入url (my-app.com/signup)并直接访问注册页面,则重定向后的flash消息在这里。但是如果我通过点击和导航进入注册页面,我被重定向到root_url,但没有flash消息。

我在C9和Heroku上都有这个问题。我检查了日志,也许这只是一个巧合,但每次flash没有出现时,我都有以下消息:"无法验证CSRF令牌的真实性。"

你知道这是从哪里来的或者如何解决这个问题吗?

下面是我的一些代码示例:

users_controller.rb

class UsersController < ApplicationController
  protect_from_forgery
  before_action :logged_in_user, only: [:index, :edit, :update, :destroy]
  before_action :correct_user,   only: [:edit, :update]
  before_action :admin_user,     only: :destroy
  [...]
def create
  @user = User.new(user_params)
  if @user.save
    @user.send_activation_email
    flash[:success] = "Please check your email to activate your account."
    redirect_to root_url
  else
    render 'new'
  end
end

application_layout.html.erb

 <% flash.each do |message_type, message| %>
  <%= content_tag(:div, message, class: "alert alert-#{message_type}") %>
 <% end %>

routes.rb

Rails.application.routes.draw do
get 'password_resets/new'
get 'password_resets/edit'
get 'user_sessions/new'
root 'static_pages#home'
# Static pages routes
get '/contact', to: 'static_pages#contact'
get '/about', to: 'static_pages#about'
# Users sign up and log in/out routes
get '/signup', to:'users#new'
post '/signup',  to: 'users#create'
get    '/login',   to: 'user_sessions#new'
post   '/login',   to: 'user_sessions#create'
delete '/logout',  to: 'user_sessions#destroy'
resources :users
resources :account_activations, only: [:edit]
resources :password_resets,     only: [:new, :create, :edit, :update]
end

如果您需要更多的信息,请告诉我,谢谢。

SOLUTION

好的,我刚刚找到了为什么它会这样做以及如何解决这个问题。

显然,users_controller中的"protect_from_forgery"行删除会话数据,flash信息和与每个验证失败的请求相关的cookie(单击以下链接获取更多信息https://nvisium.com/blog/2014/09/10/understanding-protectfromforgery/)。

我删除了那行,并添加了

<%= hidden_field_tag :authenticity_token, form_authenticity_token %>

,然后又成功了。


最新更新