Rails 创建一篇 article,但是却爆了 ActionDispatch::Cookies::CookieOverflow 的异常

ryan · 2013年06月09日 · 最后由 kisa77 回复于 2013年12月18日 · 3918 次阅读

如题。下面是我的 controller 和 view 的代码

controller:

def create
    title=params[:title]
    content=params[:content]
    summary=content[0..130]
    file_name=title+'-'+Time.now.asctime.split.join('-')
    file_path='./blogs/'+file_name+'html.slim'

    @article=Article.new(title:title,content_link:file_path,summary:summary)

    begin
        @article.save!
        File.open(file_path,'w+'){|f|
            f.write('markdown:'+content)
        }
        flash[:success]="Blog posted"
        redirect_to sign_in_admins_path
    rescue Exception => e
        flash.now[:error]="error:#{$!} at: #{$@}"
        render :new
    end
end

view

div id="article_editor"
    =form_for :article ,url:{:action=>:create} do |f|
        =text_field_tag :title
        =text_area_tag :content
        =f.submit "Post",class:"btn btn-large btn-primary"

对于这个错误已经 google 过了,很多解决方案都是说把 cookie store 改成 session store. 但是我不明白的是,我要做的仅仅只是把 content 和 title 传递回到 controller。而且,我在做测试的时候,针对 content 和 title 就写了‘aaa’和‘aaa’,不该超出 cookie 的 4kb 大小啊。。

更何况,作为 http post 请求,content title 不是应该写在 http 的 body 中嘛?为什么会和 cookie 扯上关系,还超出了上限

以下我在出错时候,看到的 cookie 数据,真心很长很长。。。。截图一部分。

求指导!这和 cookie 为什么会扯上关系,是不是我对 http 传送的请求理解错误了?

更新 已经知道,由于flash.now[:error]="error:#{$!} at: #{$@}"导致 flash 存储溢出而保存,那如果我想看出错是什么,错在哪儿。那这个异常该怎么处理呢?或者说,能不能取到异常栈的最顶层信息。

更新 2 我知道错误在哪儿了。。。因为 model 里的那个正则表达式匹配错误。。。 ActiveRecord::RecordInvalid: Validation failed: Content link is invalid

这个错误是我通过输入同样的数据在控制台里得到的。但是如果在集成的 rails 开发环境下,是否可以通过异常处理获取到这条错误信息呢?

flash.now[:error]="error:#{$!} at: #{$@}" 不要这么放,太长了,超出了

#1 楼 @ywencn 原来 flash 中所放的东西是会进 cookie 的啊?

#1 楼 @ywencn 那我应该怎么去打印这个出错信息。比如说,errors stack 的最上层错误。

#2 楼 @Ryan 严格来说,Flash 是 session 的一部分。而目前你选择的 Session 的储存机制是 CookieStore.

#4 楼 @5long 明白了。所以是错误信息放在 flash 里面,也就是 cookie 里面溢出了。

@Ryan 我也遇到这个问题,貌似网上的办法都是把 session 用 db 或者 cache 等存储,

errors.full_messages可以得到包含全部错误信息的数组,然后随便怎么操作都可以,对我来说够用了

ps:脚手架生成的 controller 代码都是把 errors 直接放进 flash,如果 model 属性多一点,溢出是迟早的事

需要 登录 后方可回复, 如果你还没有账号请 注册新账号