3

我想flash[:notice]在用户拒绝 EULA 条款时发送。所以它断开他并重定向到after_sign_out_path_for(这是我的root_path,这是我的public#index)。但是当我们到达页面时,没有任何东西看起来好像flash[:notice]丢失了。

这是我的代码:

免责声明_controller.rb

class DisclaimerController < ApplicationController
  def refuse
    @user = User.find(params[:id])
    @user.update_column('accept_disclaimer', false)
    @user.update_column('sign_in_count', 0)
    @user.save
    @user.reload
    sign_out
    flash[:notice] = "test
    redirect_to root_path
  end

公共.html.erb

<div class="main">
  <%= render_flash_messages %>      
  <div class="main-inner">

      <%= yield %>

  </div><!-- /main-inner -->
</div><!-- /main -->

application_helper.rb(与我的布局应用程序和公共一起工作)

def render_flash_messages
  render partial: "layouts/flash_messages"
end

_flash_messages.html.erb

<div class="show-notif">
  <% if notice.present? %>
    <div class="flash-message alert alert-success collapse in">
      <%= notice %>
      <button type="button" class="close" data-dismiss="alert"><i class="icon-remove"></i> <%= I18n.t('helpers.link.close') %></button>
    </div>
  <% end %>
</div>

我测试了我的部分 _flash_messages.html.erb,它在有通知时完美运行(即使在我的公共布局中)。

所以我尝试用 , 更改路径root_urlroot_pathpublic_index_path没有new_user_session_path任何效果。

我还尝试了不同的编码合成器:

  • flash[notice] = "test" then redirect_to root_path
  • redirect_to root_path, :notice => "test"
  • redirect_to root_path, notice: "test"
  • redirect_to root_path, flash
  • redirect_to root_path, :flash => { :error => "Insufficient rights!" }
  • redirect_to root_path, flash: { :error => "Insufficient rights!" }
  • redirect_to(root_path, {:flash => { :error => "Insufficient rights!" }})

(每次我尝试之前列出的所有不同路径时)

我也尝试使用flash.keepflash.keep(:notice)(我使用 Rails 版本 3.2.13)没有任何改变。

最后,我试图改变我的路线:

  • 根 :to => 重定向 { |p, req| req.flash.keep; "public#index" } 而不是
  • 根到:“public#index”

我想注意到我遇到了同样的问题,after_sign_in_path_for我找到了解决方案。问题是flash[:notice]在控制器中发送但不在此控制器的重定向中(即使使用 a flash.keep)。所以我只是放了直接路径而不是 after_sign_in_path_for 并且效果很好。但在这里,它不是。

我究竟做错了什么?

4

1 回答 1

2

我终于找到了解决办法。

我在我的中设置了一个cookieDisclaimer#refuse,重定向后cookie仍然存在,所以我测试我的cookie是否存在,如果存在,我测试它的值并在Sessions#new中设置flash消息

最后,在设置了 flash 消息之后,我删除了 cookie。

免责声明_controller.rb

def refuse
  @user = User.find(params[:id])
  @user.update_column('accept_disclaimer', false)
  @user.update_column('sign_in_count', 0)
  @user.save
  sign_out
  cookies[:login] = { :value => "refuse", :expires => Time.now + 10} # just to secure
  redirect_to root_path
end

session_controller.rb

def new
  if cookies[:login]
    if cookies[:login] == "refuse"
      flash[:alert] = "You have to accept the EULA terms to use our application."
    elsif cookies[:login] == "signout"
      flash[:notice] = "Sign out successfully"
    end
  end
  cookies.delete(:login)
  super
end

它真的很好用。但是,当非登录用户到达 root_path 时,我没有找到任何解决方案来保留我的闪存(来自重定向)。我不明白为什么。所以,如果有人能对这个问题有所了解,我真的很感兴趣。

于 2013-09-27T16:11:47.130 回答