【问题标题】:How can I implement cookieless flash messages on Rails?如何在 Rails 上实现无 cookie 的 flash 消息?
【发布时间】:2012-07-12 14:00:51
【问题描述】:

我正在开发一个 facebook 应用程序,所以 由于 P3P,我不能依赖 cookie(隐私偏好项目),是的,这太痛苦了(请参阅 slides 18 and 19 on this slideshare about Rails and Facebook apps 获取图片)...

在 Facebook 应用程序中,从浏览器的角度来看,每个 cookie 都是第三方 cookie。许多浏览器默认阻止它们。

所以我的问题是:如何在不依赖 cookie 的情况下实现 flash 消息?

更新:

我相应地修改了session_store.rb 和数据库。现在会话存储在 DB 上,但 Flash 消息仍然依赖于 cookie……请问有什么想法吗?

更新#2:

我终于找到了解决方法,请参阅下面的答案。最好的办法是 ajax 一切(根据上面链接的幻灯片),但作为快速修复,我的解决方案应该可以工作。

【问题讨论】:

    标签: ruby-on-rails facebook ruby-on-rails-3 cookieless


    【解决方案1】:

    我终于找到了一种解决方法,实现了我自己的(简单)flash 消息,并将它们通过参数从一个请求传递到另一个请求。

    首先,我在application_controller.rb 中覆盖了default_url_options,为每个请求附加一个:my_flash 参数:

    def default_url_options 
      { :my_flash => @my_flash }
    end    
    

    然后,一直在application_controller.rb,我写了一个my_flash_from_params before_filter 来设置@my_flash 变量:

    def my_flash_from_params
      @my_flash = params[:fb_flash]
    end 
    

    最后我在application.html.erb中渲染了以下_my_flash.html.erb部分

    <div class="my_flash">
      <%= my_flash %>
    </div>  
    

    调用:

     <%= render :partial => "layouts/my_flash", :locals => {:my_flash => @my_flash} if @my_flash %>
    

    如果您想尝试此解决方案,另请参阅 this answer about default_url_options rewriting

    【讨论】:

      【解决方案2】:

      Flash 消息建立在会话之上。因此,如果您将会话存储更改为使用数据库,您仍然可以依赖闪存。这可以通过编辑config/initializers/session_store.rb 并按照该文件上的说明轻松完成。

      这里有更多关于该主题的信息:Action Controller Overview -> Session

      【讨论】:

      • 我按照说明进行操作,现在会话存储在数据库中,但闪存消息仍然依赖于 cookie!现在这很奇怪......有什么想法吗?
      • 你是对的,根据文档“所有会话存储都使用 cookie 来存储每个会话的唯一 ID(您必须使用 cookie,Rails 不允许您在URL,因为这不太安全)。”。对不起:(
      • 此外,在数据库中处理会话不适用于多 dynos 应用程序......在没有 cookie 的情况下处理会话真的很痛苦。还是谢谢你。
      猜你喜欢
      • 2017-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多