为了吸引眼球,俺榜上 RubyChina 这种大山。
最近使用 Devise 来做网站帐号相关的功能。但是,发现一个诡异问题。本以为 RubyChina 的实现应该是正确的,可以成为我的“剽窃对象”。但是,经过测试后发现,竟然也有同样的问题。所以,这里就拿 RubyChina 来开刀。
最近的项目中,帐号相关的功能使用 Devise 来实现的。确实很方便,但是也发现了一个诡异问题: 无论是否勾选“记住登录状态”,在下次打开的时候,都是“已登录”。
刚开始,我不会知道怎么用 Devise。然后就上网各种使用 Google 百度一下。后来,发现下面这个这个解决方案:Devise - remember me not working? LocalHost Issue? 。检查一下,我的代码,和这里的方案没有差异。然后就想到了 RubyChina。想看看 RubyChina 是怎么搞的。
下面开始对 RubyChina 庖丁解牛。(由于只是检查 RubyChina 是否有类似问题。没有深入到代码级别。)
首先看一下 RubyChina 登录页面生成的表单标签。
当不选择“记住登录状态”时,提交的表单数据如下:
当选择“记住登录状态”时,提交的表单数据如下:
问题列表:
为什么会生成如下的代码:
<input name="user[remember_me]" type="hidden" value="0" />
为什么“记住登录状态”无效?我的猜测是当选择“记住登录状态”时,同时提交了两个user[remember_me]
,而服务器使用了user[remember_me]=1
。但是,奇怪的是,当不选择“记住登录状态”时,向服务器提交了user[remember_me]=0
,还是记住了密码。这个问题真的有点诡异。莫非是 Devise 的 Bug?
没有看 RubyChina
我自己项目中的环境:
html
<%= f.check_box :remember_me, :as => :boolean, class: 'remember' if devise_mapping.rememberable? %>
<%= f.label :remember_me, "记住密码" %>
RubyChina 中的环境:
html
<div class="inputs-list">
<label for="user_remember_me">
<%= f.check_box :remember_me, :style => "width:auto;" %>
<%= t("common.remember_me") %>
</label>
</div>
RubyChina 的环境,我是根据源代码写出来的。