繁体   English   中英

使check_box在Rails表单中工作

[英]Getting check_box to work in a Rails form

我的目标是使用登录表单上的复选框,以允许用户选择在浏览器关闭后保持登录状态。 我在登录表单的复选框中使用了以下代码(视图>会话> new.html.erb):

<div class="field">
  <%= f.check_box :stay_signed_in %> Stay signed in?
</div>

因此::stay_signed_in如果为1,则为1,否则为0。 然后,我(尝试)根据:stay_signed_in的值(在会话控制器中)将会话变量:staysignedin设置为true或false:

def create
  session[:staysignedin] = (params[:session][:stay_signed_in] == "1") ? true : false
  ...
end

此代码有问题。 即使选中此框,并且:stay_signed_in绝对为1,session [:staysignedin]也永远不会设置为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 %>

编辑:纠正:它正在将session [:staysignedin]正确设置为true或false,因此故障必须在其他位置。 问题在于,选中“保持登录状态”后,当我关闭浏览器并重新打开浏览器时,用户仍未登录。当我删除“保持登录状态吗?” 登录表单上的复选框和所有相关代码,仅保留永久登录代码,即可正常工作。

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

其余的表单代码是什么样的?

我的猜测是:stay_signed_in不是存储到params[:session][:stay_signed_in] ,而是params[:something_else][:stay_signed_in]或只是params[:stay_signed_in]

如果您在本地WEBrick上运行,则可以看到每个请求发布的参数,这将有助于确保您具有正确的参数密钥。

-编辑-

根据您的最新评论,我建议您使用Devise处理身份验证逻辑。 它实现起来非常容易,与Rails 3完全兼容,并且包括用于处理会话和记住保持登录状态的内置代码。

当有一个如此好的插件可用时,例如轻量级的,坚如磐石的,有据可查的等等,在一个简单的会话记忆问题上停留这么长时间可能不值得您花时间。

有关介绍,请参阅此Railscast

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM