【问题标题】:Rails - Checkbox not working with Remember Me for Authlogic?Rails - 复选框不适用于 Authlogic 的记住我?
【发布时间】:2017-04-17 02:03:38
【问题描述】:

所以我一直在使用 Authlogic 来允许创建用户帐户和进行身份验证。我拥有用户想要的大部分功能,但我目前在“remember_me”功能方面遇到了麻烦。

我有一个复选框来指示用户是否希望在关闭浏览器后被记住。但是,无论如何,无论我是否选中该框,“记住我”都会设置为 false。创建 user_session 后,我可以根据复选框的状态看到“remember_me”的值是正确的。尽管如此,当我将“remember_me”的值打印到控制台时,无论是否选中复选框都是错误的。

当我使用以下命令强制该值为真时,remember_me 功能按预期工作:

@user_session.remember_me = true

并将其放置在 UserSession 控制器中。 two examples 我使用了两个复选框来确定字段的值,我相信我正确地遵循了它们,所以我不知道为什么我的复选框没有正确设置“remember_me”字段。我认为可能发生的一个问题是复选框将值保存到另一个名为“remember_me”的字段中,这就是实际字段始终为假的原因。

有谁知道如何解决此问题或对如何解决此问题有任何建议?谢谢!

用户会话控制器:

class UserSessionsController < ApplicationController

  def new
    @user_session = UserSession.new
  end

  def create
    @user_session = UserSession.new(user_session_params)
    #@user_session.remember_me = true
    #puts(@user_session.remember_me)
    if @user_session.save
      flash[:success] = 'Welcome back'
      redirect_to home_path
    else
      flash[:notice] = 'Failed to log in'
      redirect_to :back
    end
  end

  def destroy
    current_user_session.destroy
    flash[:success] = 'Goodbye'
    #redirect_to root_path - Should redirect somewhere after signout
  end

  private

  def user_session_params
    params.require(:user_session).permit(:email,:password,:remember_me)
  end

end

用户会话“new.html.erb”

<div class="loginContainer" align="center">

  <h1 align="center"><b>Log In</b></h1>

  <%= form_for @user_session do |u| %>
      <div class="container">

        <%= render 'shared/errors', object:@user_session %>

        <label><b>Email</b></label>
        <%= u.text_field :email, placeholder: 'Email Address' %>
        <!--<input type="text" placeholder="Enter Username" name="uname" required> -->

        <br>
        <label>
          <b>Password</b>
        </label>
        <%= u.password_field :password, placeholder: 'Password' %>
        <!--<input type="password" placeholder="Enter Password" name="psw" required> -->

        <br>

        <%= u.label 'Remember me' %>
        <%= u.check_box :remember_me %>

        <%= u.submit 'Login', class: 'btn btn-primary' %>
        <!-- <button type="submit">Login</button> -->


      </div>
  <% end %>


  <div class="container" style="background-color:#D3D3D3">
    <%= link_to 'Forgot your password?', new_password_reset_path %>
  </div>
</div>

用户会话模型

class UserSession < Authlogic::Session::Base


    def to_key
      new_record? ? nil : [ self.send(self.class.primary_key) ]
    end

  end

用户会话请求参数(选中复选框):

<ActionController::Parameters {"email"=>"fake@gmail.com", "password"=>"password1", "remember_me"=>"1"} permitted: true>

【问题讨论】:

  • 能否提供创建操作的请求参数?
  • @fbelanger 抱歉回复晚了。我根据需要添加了请求参数,我不知道我是否做得对,但我在用户会话控制器中使用了“puts user_session_params.inspect”
  • 不错!所以我没有使用 AuthLogic,你的代码看起来不错。但是,尝试在 Rails 控制台@user_sessions.remember_me = '1' 中发送相同的参数值,看看是否是问题所在。这是唯一可以脱离 IMO 的事情。顺便说一句,puts params 也可以!
  • @fbelanger 这样做的步骤是什么?我是rails新手,所以我很抱歉。谢谢

标签: ruby-on-rails ruby-on-rails-5 authlogic


【解决方案1】:

尝试打印发送到您的操作的确切数据。

puts params
=> {user_session: {..., remember_me: "1"}}

然后在控制台尝试操作,看看复选框数据是否被解释为true,我怀疑是这个问题。

rails c
params = {..., remember_me: "1"}
session = UserSession.new(params)
session.remember_me?
=> false # if "1" is not setting this to true
=> true # if "1" is setting this true

如果这是问题,您需要将数据设为 Ruby true 布尔值。

def user_session_params
  if params[:user_session][:remember_me].present? # not nil or ""
   params[:user_session][:remember_me] = true
  end
  params.require(...).permit(...)
end

虽然我觉得 Rails 足够聪明,可以将这个布尔列作为基于存在的来处理。

【讨论】:

  • 好吧,我尝试了以下操作,当我输入 session.remember_me? 时,它返回 true。老实说,当我用puts @user_session.remember_me? 打印出值时,我真的不知道为什么它返回 false。无论如何感谢您的帮助
  • 您可以做的一件事是使用byebug 单步执行您的控制器。在第一行下方添加byebug 并检查值,然后在byebug 控制台中,像控制器一样执行@user_session.save,然后检查.valid?.errors?.remember_me?。真的很奇怪,你的代码看起来不错!
猜你喜欢
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
  • 2021-09-18
  • 2017-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多