让check_box在Rails表单中工作

时间:2011-01-17 15:18:19

标签: ruby-on-rails

我的目标是使用登录表单上的复选框,以允许用户选择在浏览器关闭后保持登录状态。我在复选框的登录表单中使用此代码(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

1 个答案:

答案 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