【问题标题】:Are params of a form available to helpers in rails 3?rails 3中的助手可以使用表单的参数吗?
【发布时间】:2023-03-19 21:51:01
【问题描述】:

我按照 Michael Hartl 的教程构建了一个带有登录的注册表单。我想我会尝试在登录表单中添加一个记住我的复选框,并将其值默认为 0,然后在选中时设置为 1。

我在 sessionhelper 中添加了一个 if 语句:

module SessionsHelper

  def login(user)
    if params[:remember_me]
    cookies.permanent.signed[:remember_token] = [user.id, user.password_salt]
    current_user = user
   else
    cookies[:remember_token] = [user.id, user.password_salt]
    current_user = user
   end
  end

  def current_user=(user)
    @current_user = user
  end

  def current_user
    @current_user ||= user_from_remember_token
  end

  def logged_in?
    !current_user.nil?
  end

  def logout
    cookies.delete(:remember_token)
    current_user = nil
  end

  private

  def user_from_remember_token
    User.authenticate_with_salt(*remember_token)
  end

  def remember_token
    cookies.signed[:remember_token] || [nil, nil]
  end

end

....但由于某种原因,当我登录时勾选或未勾选 cookie 过期时间和日期从未设置。当我在 Firefox 中检查 cookie 信息时,它总是显示“会话结束”。我错过了什么吗?

我的控制器:

class SessionsController < ApplicationController

  def new

  end


  def create
    user = User.authenticate(params[:session][:email], params[:session][:password])
    if user.nil?
      flash.now[:error] = "Invalid email password combination"
      render 'new'
    else
      login user
      redirect_to user
    end
  end

  def destroy
    logout
    redirect_to root_path
  end
end

查看:

<%= form_for(:session, :url => sessions_path) do |f| %>
  <%= f.text_field :email, :placeholder => "Email" %>      
  <%= f.password_field :password, :placeholder => "Password" %>     
  Remember me? <%= f.check_box :remember_me, :value => 1 %>
  <%= f.submit "Log in", :id => "login_submit" %>
  <% end %>

感谢您的帮助。

【问题讨论】:

  • 能否将表单模板添加到问题中?
  • 请注意:value =&gt; 1 不是必需的,请参阅the documentation

标签: ruby-on-rails ruby ruby-on-rails-3 rubygems ruby-on-rails-3.1


【解决方案1】:

您需要使用params[:session][:remember_me] 而不是params[:remember_me]。将其与控制器的用户身份验证行进行比较。

【讨论】:

  • 这有效,因为它将 cookie 设置为在 2031 年到期,但是当我不选中该框时,它会做同样的事情。
  • 看我上面的其他评论,也许:value =&gt; 1 把它扔掉了,把它删掉再试一次。
  • 虽然我不确定,但我认为您还需要明确检查参数是否为"1",而不仅仅是检查它是否存在; if params[:session][:remember_me] == "1",
  • 我设置的值把它扔掉了。谢谢rdvdijk。
【解决方案2】:

以下解决了我的问题

 def login(user)
    if params[:session][:remember_me] == "1"
    cookies.permanent.signed[:remember_token] = [user.id, user.password_salt]
    current_user = user
   elsif params[:session][:remember_me] == "0"
    cookies.signed[:remember_token] = [user.id, user.password_salt]
    current_user = user
   end
  end

查看:

    <%= form_for(:session, :url => sessions_path) do |f| %>
      <%= f.text_field :email, :placeholder => "Email" %>      
      <%= f.password_field :password, :placeholder => "Password" %>     
      Remember me? <%= f.check_box :remember_me %>
      <%= f.submit "Log in", :id => "login_submit" %>
      <% end %>

【讨论】:

    猜你喜欢
    • 2011-05-21
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    • 2011-09-13
    • 2013-10-18
    • 2011-05-07
    • 1970-01-01
    相关资源
    最近更新 更多