Ruby on rails 设计自定义会话控制器,不保存闪存消息

Ruby on rails 设计自定义会话控制器,不保存闪存消息,ruby-on-rails,devise,Ruby On Rails,Devise,我决定定制(覆盖)Desive的会话控制器,以实现我自己的登录逻辑。我把会话留给了新的控制器,只需在其中调用super即可 def new super end 但是,我已经在自定义会话#create方法中删除了对super的调用,这样我就可以向服务器发送HTTP请求以进行身份验证。随后,我要么登录用户,要么将用户返回会话的新路径,再次尝试登录 def create @member = Member.find_by_username(params[:username]) resp

我决定定制(覆盖)Desive的会话控制器,以实现我自己的登录逻辑。我把会话留给了新的控制器,只需在其中调用super即可

def new
  super
end
但是,我已经在自定义会话#create方法中删除了对super的调用,这样我就可以向服务器发送HTTP请求以进行身份验证。随后,我要么登录用户,要么将用户返回会话的新路径,再次尝试登录

def create
   @member = Member.find_by_username(params[:username])
   response = authenticate_with_api
   if response[:authenticated]
     if @member
       @member.update(response.[:member])
       sign_in @member
     else
       @member.create(response.[:member])
       sign_in @member
     end
   else
     flash[:alert] = "Incorrect username or password"
     flash[:error] = "Incorrect username or password"
     flash[:notice] = "Incorrect username or password" #setting all the messages out of frustration!
     redirect_to new_member_session_path
   end
逻辑流工作正常,但未显示闪存消息。在新方法中调用super之前,我设置了一条flash消息,以确保视图设置正确:

def new
  flash[:notice] = "Test flash message"
  super
end
这很有效。我可以在模板中看到flash消息。我能想到的唯一解释是,不知何故,出现了多个重定向。但是,当我查看日志时,我只能看到我指定的重定向。我还尝试使用keep通过多个请求持久化flash消息,但即使这样也不起作用:

flash.keep[:notice] = "Test flash message"
redirect_to new_member_session_path #does not work
我还尝试使用now作为最后的努力:

flash.now[:notice] = "Test flash message"
没有骰子。最后,我尝试将flash消息与重定向内联:

redirect_to new_member_session_path, flash: { :notice => "Test flash message" } #also does not work
我不知所措。不知道为什么flash消息会丢失。我正在运行Rails 4.1.2和Desive 3.2.4

编辑:

我认为这不是定制身份验证的最佳方式。相反,我创建了一个定制的典狱长策略,并告诉Desive:

#config/initializers/devise.rb
config.warden do |manager|
  manager.intercept_401 = false
  manager.default_strategies(:scope => :member).unshift :member_login
end
我把我所有的逻辑都放在那个文件里:

Warden::Strategies.add(:member_login) do
  def member_params
    ActionController::Parameters.new(@response).permit(:first_name, :last_name, :role, :username, :parkplace_user_id)
  end

  def valid?
    params[:member] && ( params[:member][:username] || params[:member][:password] )
  end

  def authenticate!
    member = Member.find_by_username(params[:member][:username])
    if authenticate_with_ppd_api
      if member
        member.update(member_params)
        success!(member)
      else
        member = Member.create(member_params)
        success!(member)
      end
    else
      fail!("Incorrect username or password")
    end
  end

  def authenticate_with_api
    @response = HTTParty.post('https://path.to.server/admin/login', body: { username: params[:member][:username], password: params[:member][:password] } )
    @response = JSON.parse(@response.body).first
    @response["authenticated"]
  end

end

Flash消息正在出现,但我在登录时遇到其他问题。我为此提出了一个新问题。谢谢

既然还没人回答,我建议试试“flash.now[:type]”?是的,我也试过了!我会更新我的问题。谢谢
new\u member\u session\u path
指的是什么操作?该操作中是否有重定向?控制器#操作是成员/会话#new这里有一个响应,但没有另一个重定向