我的目标是使用登录表单上的复选框,以允许用户选择在浏览器关闭后保持登录状态。我在复选框的登录表单中使用此代码(views> sessions> new.html.erb):
<div class="field">
<%= f.check_box :stay_signed_in %> Stay signed in?
</div>
:如果选中,则stay_signed_in为1,否则为0。然后我(尝试)设置一个会话变量:keepignedin为true或false,具体取决于:stay_signed_in(在会话控制器中):
def create
session[:staysignedin] = (params[:session][:stay_signed_in] == "1") ? true : false
...
end
此代码有问题。即使选中该框并且:stay_signed_in肯定是1,会话[:stayignedin]也永远不会设置为true。我哪里错了?
编辑: 登录表单的其余部分如下所示:
<%= form_for(:session, :url => sessions_path) do |f| %>
<div class="field">
<%= f.label :email %><br />
<%= f.text_field :email %>
</div>
<div class="field">
<%= f.label :password %><br />
<%= f.password_field :password %>
</div>
<div class="field">
<%= f.check_box :stay_signed_in %>
Stay signed in on this computer?
</div>
<div class="actions">
<%= f.submit "Sign in" %>
</div>
<% end %>
编辑:更正:正确设置会话[:stayignedin]为真或假,因此故障必须在其他地方。问题是选中“保持登录状态”,当我关闭浏览器并重新打开它时,用户仍然没有登录。当我删除“保持登录状态?”登录表单上的复选框和所有相关代码,只留下永久登录代码,它工作正常。
def sign_in(user)
if session[:staysignedin]
cookies.permanent.signed[:remember_token] = [user.id, user.salt]
else
session[:userid] = user.id
end
self.current_user = user
end
def sign_out
if session[:staysignedin]
cookies.delete(:remember_token)
else
session[:userid] = nil
session[:staysignedin] = nil
end
self.current_user = nil
end
答案 0 :(得分:0)
您的表单代码的其余部分是什么样的?
我的猜测是:stay_signed_in没有存储到params[:session][:stay_signed_in]
,而是存储params[:something_else][:stay_signed_in]
或params[:stay_signed_in]
如果您在本地WEBrick上运行,您可以看到每个请求发布的参数,这将帮助您确保获得正确的参数密钥。
- 编辑 -
根据您的上一条评论,我建议您使用Devise来处理您的身份验证逻辑。它非常容易实现,完全兼容Rails 3,并包含用于处理会话和记住保持登录的内置代码。
如果有一个很好的插件可以轻松,坚如磐石,有良好记录等等,在一个简单的会话中记住问题可能不值得你花时间长时间陷入困境。
有关简介,请参阅此Railscast。