【问题标题】:Getting check_box to work in a Rails form让 check_box 在 Rails 表单中工作
【发布时间】:2011-01-17 15:18:19
【问题描述】:

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

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

:stay_signed_in 因此如果选中则为 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] 为真或假,因此故障必须在其他地方。问题是选中“保持登录”后,当我关闭浏览器并重新打开它时,用户仍未登录。当我删除“保持登录?”时登录表单和所有相关代码上的复选框,只留下永久登录代码,它工作正常。

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

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

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

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

    如果您在本地 WEBrick 上运行,您可以看到随每个请求发布的参数,这将帮助您确保获得正确的参数键。

    -编辑-

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

    当有一个轻量级、坚如磐石、文档齐全等优秀插件可用时,可能不值得花时间在一个简单的会话记忆问题上停留这么长时间。

    有关介绍,请参阅此Railscast

    【讨论】:

    • 我相信我的参数是正确的 - 来自 WEBrick:参数:{"utf8"=>"✓", "authenticity_token"=>"q702NkNyTh08PRkLTt9TF2grtmVYiNYdXIUj3G+pszs=", "session"=>{" email"=>"user1@testing.com", "password"=>"[FILTERED]", "stay_signed_in"=>"1"}, "commit"=>"登录"}
    • 嗯...是的,看起来你有这个权利。好吧,您还对控制器中的会话和参数散列做什么?您是否有可能在代码的其他地方将其重置为默认状态?
    • 似乎非永久登录/退出代码在某种程度上干扰了永久登录代码。
    • 见上面的评论——我不知道是什么导致了你的问题,但你可能应该考虑只使用一个插件并继续使用使你的应用程序独一无二的代码。 :)
    • 我想我会接受这个建议!
    猜你喜欢
    • 1970-01-01
    • 2012-05-11
    • 2014-07-15
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多