我遵循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 %>
,然后又成功了。